【问题标题】:How can I use values within a MATLAB matrix as indices to determine the location of data in a new matrix?如何使用 MATLAB 矩阵中的值作为索引来确定新矩阵中数据的位置?
【发布时间】:2014-11-10 12:49:32
【问题描述】:

我有一个如下所示的矩阵。

我想根据以下规则将第 3 列的值放入另一个矩阵中。

第 5 列中的值是新矩阵的行索引,第 6 列是列索引。因此,20(取自 29,3)应位于新矩阵的第 1 行第 57 列,30(取自 30,3)应位于新矩阵的第 1 行第 4 列,依此类推。

如果第 3 列中的值为 NaN,那么我希望将 NaN 复制到新矩阵中。

【问题讨论】:

  • 你有没有尝试过什么?恕我直言,您不能只提出问题,期望人们根据您的要求为您提供代码:)
  • 我在发帖之前确实做了一些尝试,但我认为它们已经偏离了轨道,因此不会帮助回答者或这个问题的未来读者。我是否应该用更笼统的术语表达我的问题,例如不提供我自己的数据集的图像?帮助中心说:“您应该只根据您面临的实际问题提出实用、可回答的问题。”
  • @user1205901:在文档中查找sub2ind

标签: matlab matrix matrix-indexing


【解决方案1】:

例子:

% matrix of values and row/column subscripts
A = [
 20  1 57
 30  1 4
 25  1 16
 nan 1 26
 nan 1 28
 25  1 36
 nan 1 53
 50  1 56
 nan 2 1
 nan 2 2
 nan 2 3
 80  2 5
];

% fill new matrix
B = zeros(5,60);
idx = sub2ind(size(B), A(:,2), A(:,3));
B(idx) = A(:,1);

还有其他几种方法可以做到这一点,但我认为上面的代码很容易理解。它正在使用linear indexing


假设你没有重复的下标,你也可以使用:

B = full(sparse(A(:,2), A(:,3), A(:,1), m, n));

(其中mn 是输出矩阵大小)

另一个:

B = accumarray(A(:,[2 3]), A(:,1), [m,n]);

【讨论】:

  • 我需要将我的数组从 double 转换为 int 以遵循您的建议吗?
  • 不,只要双精度代表有效的下标(整数大于或等于 1)。例如,您不能使用分数对数组进行索引:x = rand(1,10); x(1.3)(错误!)
【解决方案2】:

我不确定我是否清楚地理解了您的问题,但这可能会有所帮助:

(假设你的主矩阵是A

nRows = max(A(:,5));
nColumns = max(A(:,6));

FinalMatrix = zeros(nRows,nColumns);

for i=1:size(A,1)
    FinalMatrix(A(i,5),A(i,6))=A(i,3);
end

请注意,上面的代码将其余元素设置为零。

【讨论】:

    猜你喜欢
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 2016-10-02
    • 2011-12-24
    • 2015-12-09
    • 1970-01-01
    • 2018-01-02
    相关资源
    最近更新 更多