Matlab中的子集数组

时间:2018-01-31 18:57:44

标签: arrays matlab multidimensional-array

好吧,我想更改零元素,例如,(它们是零不是重点)我正在使用此代码,但是当我转到子集时它不会很好。< / p>

matrix = [ -1 1 0; 2 0 -2; 0 3 -3]
[rows,cols] = find(matrix==0)


matrix =
    -1     1     0
     2     0    -2
     0     3    -3
rows =
     3
     2
     1
cols =
     1
     2
     3


matrix(rows,cols)
ans =
     0     3    -3
     2     0    -2
    -1     1     0

为什么只有三个单个元素才会返回整个矩阵?

因此,如果我做矩阵(rows,cols)= 1,它将整个矩阵返回为1,而不仅仅是零元素。

1 个答案:

答案 0 :(得分:3)

MATLAB语法提供了几种访问数组中非连续元素的选项。

解决问题的一种方法是使用linear indexing

matrix = [ -1 1 0; 2 0 -2; 0 3 -3]

[rows,cols] = find(matrix == 0).

然后

sub2ind(size(matrix),rows,cols)

返回所选元素的线性索引,即向量[3;5;7]

现在

matrix(sub2ind(size(matrix),rows,cols)) = 1

会产生

matrix =

  -1   1   1
   2   1  -2
   1   3  -3

正如您所期望的那样。

说明

使用线性索引,MxN MATLAB矩阵的元素在长度为M * N的平面1维数组中得到连续数。

实际上,返回线性索引是MATLAB函数的默认操作模式

    k = find(X).

正如@beaker在评论中指出的那样,你可以使用find(X)的输出,如

   matrix(find(matrix == 0)) = 1.

但是,如果您已经获得了行和列索引的向量(也称为下标),则可以使用sub2ind函数将它们转换为线性索引。