例如:
>> tmp = ones(5,5)
tmp =
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
我想要一个像:
这样的命令tmp(colNum - 2*rowNum > 0) = 0
当列号超过行号的两倍时修改tmp
的条目,例如它应该产生:
tmp =
1 1 0 0 0
1 1 1 1 0
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
作为第二个例子,tmp(colNum - rowNum == 0) = 0
应该将tmp
的对角元素设置为零。
答案 0 :(得分:3)
可能更有效的解决方案是使用bsxfun
,如此
nRows = 5;
nCols = 5;
bsxfun(@(col,row)~(col - 2*row > 0), 1:nCols, (1:nRows)')
您可以将其概括为仅接受一个函数,使其成为
bsxfun(@(col,row)~f(col,row), 1:nCols, (1:nRows)')
现在只需用你在问题中指定等式的方式替换f
,即
f = @(colNum, rowNum)(colNum - 2*rowNum > 0)
或
f = @(colNum, rowNum)(colNum - rowNum == 0)
当然,指定接受(row,col)
而不是(col,row)
的函数可能更有意义,因为MATLAB如何编制索引
答案 1 :(得分:2)
您可以使用meshgrid
生成2D坐标网格,然后使用此网格强加您想要的任何条件。您寻找的变体输出2个2D矩阵,其中第一个矩阵为您提供列位置,第二个矩阵输出行位置。
例如,根据您的情况:
>> [X,Y] = meshgrid(1:5, 1:5)
X =
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
Y =
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
您可以看到X
和Y
之间共享的每个唯一空间位置都可以为您提供所需的2D位置,就像您正在设想2D网格一样。
因此,在第一种情况下你会做这样的事情:
[X,Y] = meshgrid(1:5,1:5); % Generate 2D coordinates
tmp = ones(5); % Generate desired matrix
tmp(X > 2*Y) = 0; % Set desired locations to 0
我们得到:
>> tmp
tmp =
1 1 0 0 0
1 1 1 1 0
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
最后是你的第二个例子:
[X,Y] = meshgrid(1:5,1:5); % Generate 2D coordinates
tmp = ones(5); % Generate desired matrix
tmp(X == Y) = 0; % Set desired locations to 0
我们得到:
>> tmp
tmp =
0 1 1 1 1
1 0 1 1 1
1 1 0 1 1
1 1 1 0 1
1 1 1 1 0
简单地说,生成一个2D坐标网格,然后使用logical
/布尔条件将这些坐标直接索引到您想要的矩阵中,将所需位置设置为0。