【问题标题】:How to keep only repetitions that meet certain row assumptions when the matrix is 3D in MATLAB?当矩阵在 MATLAB 中是 3D 时,如何只保留满足某些行假设的重复?
【发布时间】:2021-03-01 16:42:18
【问题描述】:

我有以下 3D 数组:

x = randn(31,6,1000);

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

  1. 第一次观察的第 1 到 12 行必须是正数;
  2. 第二次观察的第 1 到 12 行必须为正;
  3. 第 1 次观察的第 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;

谁能帮帮我?

PS:数据集不代表原始数据集,只是为了看看代码如何工作。

谢谢!

【问题讨论】:

  • Nitpick:二维数组称为矩阵。 3D 数组是 3D 数组,而不是矩阵。 3D 矩阵就像 2D 向量。
  • 1000 个随机正态分布值非负的概率接近 0。大约是 1/2^1000。一列是非负数的概率是 1/2^12 = 1/4096。 12 行 3 列非负数的概率为 1/12288。
  • @ThomasSablik 是真的!然而,我只需要随机数据。我需要查看代码以应用于我的原始数据集
  • 从统计上讲,您必须调用x = randn(31,6,1000); 12 次才能获得一个满足条件的结果。使用x = randn(31, 6, 3); x(1:12, [1 2 6], :) = abs(x(1:12, [1 2 6], :)) 可以节省大量时间

标签: matlab loops if-statement matrix multidimensional-array


【解决方案1】:

概率

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]))

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

all(x(1:12, [1 2 6], :) > 0, [1 2]) 检查条件并返回一个逻辑向量。 Matlab中可以使用逻辑向量拼接数组。

【讨论】:

  • 非常好的答案!非常感谢!我从他们身上学到了不少东西。作为个人政策,我倾向于给声誉较低的受访者提供正确答案。但任何一个答案都适用于我的数据集
【解决方案2】:

既然你说随机数据不具有代表性,那它很可能代表了其他一些计算的结果。

如果您想重复这些计算,直到满足条件,您可以使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    相关资源
    最近更新 更多