我有一个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语句不正确。
答案 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
k的值如下图所示:
T=160;t = 1:T;k = floor((t-1)/20)+1;figure;plot(t, k, 'x');grid on;
我能实现的最紧凑的解决方案:
C = A.*imresize((B ~= 0), size(A), 'nearest');