【问题标题】:Convert vector of indices into matrix将索引向量转换为矩阵
【发布时间】:2012-03-30 17:10:48
【问题描述】:

我想将一个索引向量转换为一个矩阵,其中索引列中包含一个。

x = [2;1;3;1];
m = someFunc(x,3)
% m =
%
%   0   1   0
%   1   0   0
%   0   0   1
%   1   0   0

【问题讨论】:

标签: matlab


【解决方案1】:

我测试了 sub2ind 函数,但是在 coursera 机器学习论坛上我被指出了这个美丽。

m = eye(num_cols)(x,:);

它使用单位矩阵根据 x 中的值选择适当的列。

【讨论】:

  • 我不明白这个的语法
  • 玩它。尝试使用小的单位矩阵并首先运行单个值而不是向量 x。例如。 eye(4)(3,:) 这将占用单位矩阵的第三行。然后尝试使用矢量eye(4)([2,3,1], :)。这将获取单位矩阵的第二、第三和第一行。
【解决方案2】:

一种方法是使用 SUB2IND 函数:

colN = 3;
assert(max(x)<=colN,'Not enough columns') %# check that you have enough columns
%# other checks that x is valid indices

m = zeros(numel(x),colN);
m(sub2ind(size(m),1:numel(x),x')) = 1;

【讨论】:

    【解决方案3】:

    我有一个非常相似的问题,所以我不想打开一个新问题。我想将索引的行向量转换为索引的行(而不是列)中的矩阵。我本可以使用之前的答案并将其倒置,但我认为这对于非常大的矩阵会表现得更好。

    octave> x = [2 1 3 1];
    octave> m = setRowsToOne(x, 3)
    m =
    
       0   1   0   1
       1   0   0   0
       0   0   1   0
    

    我看不到如何使用 sub2ind 来完成这个,所以我自己计算了一下。

    function matrixResult = setRowsToOne(indexOfRows, minimumNumberOfRows)
       numRows = max([indexOfRows minimumNumberOfRows]);
       numCols = columns(indexOfRows);
       matrixResult = zeros(numRows, numCols);
       assert(indexOfRows > 0, 'Indices must be positive.');
       matrixResult(([0:numCols-1]) * numRows + indexOfRows) = 1;
    end
    
    x = [2 1 3 1];
    m = setRowsToOne(x, 3)
    

    【讨论】:

      【解决方案4】:

      您可以使用accumarray,这让这很容易,就像这样:

      accumarray([ (1:length(x))', x ], 1, [4, 3])
      

      1:length(x) 部分指定这些行进入哪些行,x 进入哪些列。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-10
        • 2021-04-29
        • 2010-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-14
        相关资源
        最近更新 更多