我有以下3D阵列:
x = randn(31,6,1000);
我想做的是只保留满足以下条件的n次重复:
- 第一次观察的从1到12的行必须是正的
- 用于第二次观察的从1到12的行必须是正的
- 用于第六次观察的从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
来检查它是否有效。