通过在MATLAB中使用if语句从另外两个组合创建新矩阵

时间:2017-03-23 18:05:54

标签: matlab loops if-statement matrix replace

我有一个8x6的矩阵。该矩阵中的一半元素为0,这是完全正常的。现在,我想引用另一个160x6的矩阵。 8x6矩阵基于160x6矩阵,由滚动窗口(20个观测值)产生。

我想创建一个新矩阵(再次160x6)。每当我的8x6矩阵中的一个元素等于0时,我希望原始的160x6矩阵中的20个观察值指向该元素(为0)也是0。

我尝试了以下内容:

for t=1:T
    for i=1:N
    if B(:,i) == 0;
    C(t,i) = 0;
    else
    C(t,i) = A(t,i);
    end
    end
end

我有:

A是160x6矩阵

B是8x6矩阵

C作为160x6矩阵的新输出

目前,我获得了一个“新的”160x6矩阵(C),但它完全复制了原始的160x6矩阵(A)。所以循环或if语句不正确。

2 个答案:

答案 0 :(得分:2)

我会基于对你的问题的理解给出一个小例子。

>> B = randi(10,8,6) - 5; % Sample B matrix

B =

    -4     0    -4     4     5     1
    -2     3     3     1     3    -4
    -1     3     1    -3     1     4
     2     5     0    -2     0     4
    -3     4     5     4    -4     3
     3    -1     2    -4     2    -3
    -3     2     2     0    -4     2
     2    -3     4    -3    -4     1

在此矩阵中,您想要识别具有0的位置,例如(1,2),(4,3),(4,5)。在160×6矩阵(1:20,2),(61:80,3),(61:80,5)应为零。您可以使用repelem函数来获取此类索引。

>> zeroIdx = repelem(B == 0,20,1)
对于B为零的任何地方,

zeroIdx将包含true,每行重复20次。

>> C = A
>> C(zeroIdx) = 0 % Assign 0 to C using zeroIdx

答案 1 :(得分:1)

检查以下内容:

%Initialize A matrix with ones for testing.
A = ones(160, 6);
B = ones(8, 6);

%Put few zeros in B
B(1:2:end,1) = 0;
B(5:3:end,3) = 0;

T = 160;
N = 6;

for t=1:T
    for i=1:N
        %The formula k = floor((t-1)/20)+1 equals 1, 1, 1, 1... 20 times, then 2, 2, 2, 2... 20 times
        k = floor((t-1)/20)+1;
        if B(k,i) == 0;
            C(t,i) = 0;
        else
            C(t,i) = A(t,i);
        end
    end
end

%Display C as an image (for testing).
figure;imagesc(C);colormap gray

测试结果的图像:
enter image description here

k的值如下图所示:

T=160;t = 1:T;k = floor((t-1)/20)+1;figure;plot(t, k, 'x');grid on;

enter image description here

我能实现的最紧凑的解决方案:

C = A.*imresize((B ~= 0), size(A), 'nearest');