【问题标题】:Subsetting array in MatlabMatlab中的子集数组
【发布时间】:2018-01-31 18:57:44
【问题描述】:

嗯,我想更改零元素,例如(它们是零不是重点),我正在使用这段代码,但是当我去子集时它做得不好。

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

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

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

【问题讨论】:

  • 之所以没有按您期望的方式工作,是因为您没有要求 3 个元素,而是要求 3 行,并且在这 3 行中,3 列。

标签: arrays matlab multidimensional-array


【解决方案1】:

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 的平面一维数组中获得连续数字。

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

    k = find(X).

正如@beaker 在 cmets 中指出的那样,您可以只使用find(X) 的输出

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

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

【讨论】:

  • 为什么不直接indices = find(matrix == 0)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多