MATLAB:仅当条件为真时才向空矩阵添加列
MATLAB: adding columns to an empty matrix only when condition is true
我有一个图像 (orig) 和一个相应的二进制蒙版 (maskD),由垂直 streaks/columns 值零或一组成。我正在尝试制作第三个矩阵(streakTemp),该矩阵仅由图像中掩码中具有 1 值的那些列组成。我正在使用下面的代码,出于某种原因,它把我正在寻找的两列作为输出,然后在掩码值为 0 的地方给出零值……所以我的输出与我的输入图像具有相同的 x 长度...它应该更短,排除了零的掩码值。不知道我做错了什么……有什么想法吗?谢谢!
streakTemp=[];
for i=1:x
if maskD(1,i)==1
streakTemp(:,i)=orig(:,i);
end
end
imtool(streakTemp);
我想这就是你需要的:
orig = reshape(1 : 20, 4, 5)
maskD = [1 0 0 1 1; 1 0 0 1 1; 1 0 0 1 1; 1 0 0 1 1]
mask1D = maskD(1, :)
x = 5;
streakTemp=[];
for i=1:x
if maskD(1,i)==1
streakTemp(:,i)=orig(:,i);
end
end
streakTemp
streakTemp2 = orig(:, logical(mask1D))
它输出:
orig =
1 5 9 13 17
2 6 10 14 18
3 7 11 15 19
4 8 12 16 20
maskD =
1 0 0 1 1
1 0 0 1 1
1 0 0 1 1
1 0 0 1 1
mask1D =
1 0 0 1 1
streakTemp =
1 0 0 13 17
2 0 0 14 18
3 0 0 15 19
4 0 0 16 20
streakTemp2 =
1 13 17
2 14 18
3 15 19
4 16 20
这里有更多关于 logical indexing 的内容。
请注意,您的 maskD
根本不必是矩阵;你只需要存储第一行,这就是我使用 mask1D
.
的原因
您的代码变体应该可以工作:
streakTemp=[];
j=1;
for i=1:x
if maskD(1,i)==1
streakTemp(:,j)=orig(:,i);
j=j+1;
end
end
你遇到的问题是 i
索引总是对应于原始矩阵列,因此即使不满足掩码条件也不会跳过该列。
你不应该在这里使用循环。直接逻辑索引完全可以满足您的目的:
streakTemp = orig(:, maskD(1,:) == 1);
请记住,maskD
是一个与原始图像大小相同的蒙版,因此我们只需访问第一行即可进行检查。简而言之,这会查看 maskD
等于 1 的所有列,然后使用相应的位置从 orig
矩阵中进行子采样,以创建一个新矩阵,删除所有不需要的列。
streakTemp=[];
for i=1:x
if maskD(1,i)==1
streakTemp(:,i)=orig(:,i);
end
end
imtool(streakTemp);
我想这就是你需要的:
orig = reshape(1 : 20, 4, 5)
maskD = [1 0 0 1 1; 1 0 0 1 1; 1 0 0 1 1; 1 0 0 1 1]
mask1D = maskD(1, :)
x = 5;
streakTemp=[];
for i=1:x
if maskD(1,i)==1
streakTemp(:,i)=orig(:,i);
end
end
streakTemp
streakTemp2 = orig(:, logical(mask1D))
它输出:
orig =
1 5 9 13 17
2 6 10 14 18
3 7 11 15 19
4 8 12 16 20
maskD =
1 0 0 1 1
1 0 0 1 1
1 0 0 1 1
1 0 0 1 1
mask1D =
1 0 0 1 1
streakTemp =
1 0 0 13 17
2 0 0 14 18
3 0 0 15 19
4 0 0 16 20
streakTemp2 =
1 13 17
2 14 18
3 15 19
4 16 20
这里有更多关于 logical indexing 的内容。
请注意,您的 maskD
根本不必是矩阵;你只需要存储第一行,这就是我使用 mask1D
.
您的代码变体应该可以工作:
streakTemp=[];
j=1;
for i=1:x
if maskD(1,i)==1
streakTemp(:,j)=orig(:,i);
j=j+1;
end
end
你遇到的问题是 i
索引总是对应于原始矩阵列,因此即使不满足掩码条件也不会跳过该列。
你不应该在这里使用循环。直接逻辑索引完全可以满足您的目的:
streakTemp = orig(:, maskD(1,:) == 1);
请记住,maskD
是一个与原始图像大小相同的蒙版,因此我们只需访问第一行即可进行检查。简而言之,这会查看 maskD
等于 1 的所有列,然后使用相应的位置从 orig
矩阵中进行子采样,以创建一个新矩阵,删除所有不需要的列。