【问题标题】:Creating a matrix from indices and value matrix从索引和值矩阵创建矩阵
【发布时间】:2013-11-18 12:09:39
【问题描述】:

我是 Matlab 的新手,但我翻阅了文档,找不到我正在寻找的答案。

我对矩阵进行了多次计算,最终得到了一个索引列表和一个应该放入这些索引的值列表。

例如:

Data =

         0         0         0         0         0         0
    3.7417    3.7417    3.7417    7.0711    3.3166    3.3166
    4.2426    4.2426    3.7417    7.0711    5.3852    7.0711
    7.0711    6.0828    5.3852    7.4833    6.0828    7.6158
    7.1414    7.4833    7.8740    8.7750    7.1414    7.8740

Indices =

     1     2     3     4     5     6
     3     3     1     1     6     5
     2     1     2     6     3     4
     4     5     5     2     2     2
     5     4     6     5     1     3

我想要做的是构造一个方阵(大小为 n,基于索引矩阵中找到的最大值索引),这样Indices 的第一列用于索引第一行Result 矩阵,Data 的值放在Result 矩阵的对应位置,所有未索引的位置都设置为0。

即使用上面的数据和索引矩阵,我希望最终矩阵看起来像:

Result =
          0   4.2426    3.7417    7.0711    7.1414         0
     4.2426        0    3.7417    7.4833    6.0828         0
     3.7417   3.7417         0         0    5.3852    7.8740 
     7.0711   7.4833         0         0    8.7750    7.0711
     7.1414   6.0828    5.3852         0         0    3.3166
          0   7.6158    7.8740    7.0711    3.3166         0

(上面可能有一些错误,因为我是手工完成的,但它应该提供我想要做什么的想法)

在 Matlab 中是否有一种快速简便的方法来做到这一点?许多函数返回索引,我希望有一种简单的方法可以使用这些索引更新/构造矩阵。

谢谢,

格雷格

【问题讨论】:

    标签: matlab matrix indices


    【解决方案1】:

    我知道的最简洁的方法是根据您的数据和索引创建一个稀疏矩阵:

    [M,N] = size(Indices); indmax = max(Indices(:));
    Result = sparse(repmat(1:N,M,1),Indices,Data,indmax,indmax);
    

    希望有人能来向我们展示一种更清洁的方法。

    【讨论】:

    • 我不认为它比这更干净。如果这是目标,您总是可以用full 包裹sparse。 +1
    • @chappjc 我一直希望有一天有人会出现并告诉我如何在不使用sub2ind 的情况下索引矩阵中不相交的元素列表。出于某种原因,我一直对必须提供要索引的矩阵的大小这一事实提出异议。
    • 是的,下标是成对的这一事实并不直观。为什么Result([1 2],[1 2]) 指的是 4 个元素而不是 2 个元素,这很难理解。如果只有 MathWorks 可以为“自动 sub2ind”行为招募不同的括号。
    【解决方案2】:

    你所描述的是这样完成的:

    [II,JJ]=meshgrid(1:size(Data,2),1:size(Data,1));
    Result = zeros(size(Data,2));
    Result(sub2ind(size(Result),II(:),Indices(:))) = Data(:);
    

    请注意,通过meshgrid 语句获取II 等效于II=repmat(1:size(Data,2),size(Data,1),1);

    【讨论】:

      【解决方案3】:

      这个基于bsxfun 的解决方案似乎比@nispio 和@chappjc 的解决方案快一点:

      S = max(Indices(:));
      Result = zeros(S);
      Result(bsxfun(@plus, (Indices-1)*S, 1:S)) = Data;
      

      【讨论】:

      • +1 用于编写您自己的 sub2ind 函数。 :) 然而,在我看来,你获得的速度会失去可读性。
      猜你喜欢
      • 1970-01-01
      • 2023-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多