在MATLAB中,当矩阵是3D时,如何只保持满足某些行假设的重复



我有以下3D阵列:

x = randn(31,6,1000);

我想做的是只保留满足以下条件的n次重复:

  1. 第一次观察的从1到12的行必须是正的
  2. 用于第二次观察的从1到12的行必须是正的
  3. 用于第六次观察的从1到12的行必须是正的

在编码方面:

% keep only the n repetitions out of 1000 that meet:
% 1. x(1:12, 1, :) > 0;
% 2. x(1:12, 2, :) > 0;
% 3. x(1:12, 6, :) > 0;

有人能帮我吗?

附言:数据集并不代表原始数据集,它只是为了看看代码是如何工作的。

谢谢!

x = randn(31,6,1000);

创建满足要求的数据是非常低的。您可以创建所需的数据,而不是创建随机数据并进行过滤:

x = randn(31, 6, 3);
x(1:12, [1 2 6], :) = abs(x(1:12, [1 2 6], :));

或者,您可以使用进行过滤

idx = logical(zeros(1, 1000));
for z = 1:1000
if all(x(1:12, [1 2 6], z) > 0, 'all')
idx(i) = true;
end
end
result = x(:, :, idx);

一个更短的版本是:

result = x(:, :, all(x(1:12, [1 2 6], :) > 0, [1 2]))

但正如我所说,这种可能性很低。我用试过了

result = x(:, :, all(x(1:12, [1 2 6], :) > -0.75, [1 2]))

在大多数情况下没有结果,在其他一些情况下只有一个结果。

CCD_ 1检查准则并返回逻辑向量。您可以在Matlab中使用逻辑向量来拼接数组。

由于您说随机数据不具有代表性,因此它很可能代表其他一些计算的结果。

如果您想重复这些计算,直到满足标准,您可以使用while循环:

n = 0; % some counter to keep track of the number of repetitions
condition_met = false; 
while ~condition_met && n < 100
x = randn(31,6,1000); % where you get your x
bool_arr = x(1:12, [1 2 6],:) > 0; % check if elements of interest are >0
condition_met = all(bool_arr(:)); % and check if your conidition is met
n = n + 1
end

事实上,对于randn,这不太可能成功,但您可以通过在while循环开始时执行x = randn(31,6,1000) + n来检查它是否有效。

相关内容

  • 没有找到相关文章

最新更新