基于行号和列号的线性方程修改矩阵的部分

时间:2016-05-30 06:12:16

标签: matlab matrix indexing

例如:

>> 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的对角元素设置为零。

2 个答案:

答案 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

您可以看到XY之间共享的每个唯一空间位置都可以为您提供所需的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。