【问题标题】:Obtain matrix of indices in octave / matlab在八度/ matlab中获取索引矩阵
【发布时间】:2013-05-13 21:51:36
【问题描述】:

在 Octave / Matlab 中给定一些多维矩阵 A,

获得与 A 相同大小的矩阵的最简单方法是什么,其中所有元素都被它们沿第 k 维的索引替换

即矩阵

A =

ans(:,:,1) =

   0.095287   0.191905
   0.226278   0.749100

ans(:,:,2) =

   0.076826   0.131639
   0.862747   0.699016

我想要一个函数 f 使得 f(A,1) =

ans(:,:,1) =

   1   1
   2   2

ans(:,:,2) =

   1   1
   2   2

f(A,2) =

ans(:,:,1) =

   1   2
   1   2

ans(:,:,2) =

   1   2
   1   2

f(A, 3) =

ans(:,:,1) =

   1   1
   1   1

ans(:,:,2) =

   2   2
   2   2

另外,给定一个稀疏矩阵 B

获得另一个相同大小的稀疏矩阵的最简单方法是什么,其中非零元素被它们沿第 k 维的索引替换? (与上述问题相同,但仅适用于非零元素)

理想情况下,我正在寻找一种可以很好地矢量化 octave 的方法(这意味着它不会显式循环任何内容)

澄清:对于稀疏矩阵,我正在寻找一种不涉及在任何点创建全尺寸(B)矩阵的解决方案

【问题讨论】:

    标签: matlab matrix octave vectorization indices


    【解决方案1】:

    如果有人好奇,由于我不了解 ndgrid,以下是我想出的答案:

    function [y] = indices(a,k)
        s = size(a);
        n = s(k);
        D = length(s);
        x = permute(a,[k,1:(k-1),(k+1):D]);
    
        y = reshape(x,n,[]);
        y = diag(1:n) * ones(size(y));
        y = reshape(y,size(x));
    
        y = permute(y,[(2:k),1,(k+1):D]);
    endfunction
    
    function [y] = spindices(a,k)
        s = size(a);
        n = s(k);
        D = length(s);
        x = permute(a,[k,1:(k-1),(k+1):D]);
    
        y = reshape(x,n,[]);
        y = spdiag(1:n) * spones(y);
        y = reshape(y,size(x));
    
        y = permute(y,[(2:k),1,(k+1):D]);
    endfunction
    

    【讨论】:

      【解决方案2】:

      ndgrid() 做你想做的事,虽然不是你要找的格式。如果您事先知道输入 A 的尺寸,则可以使用以下行来创建 N 维网格:

      % for matrix a where ndims(a) == 3
      [x, y, z] = ndgrid (1:size(a,1), 1:size(a,2), 1:size(a,3));
      % x is like f(a, 1)
      % y is like f(a, 2)
      % z is like f(a, 3)
      

      您也许可以围绕 ndgrid() 编写自定义包装器,以将其转换为您正在寻找的函数格式。

      【讨论】:

      • 谢谢你,你能给我指点ngrid的文档吗?我搜索了“octave ngrid”,但没有出现
      • 这是ndgrid 不是ngrid。它是著名的meshgrid 函数的扩展。
      • 哦,好像只有matlab。它在 Octave 中不存在。编辑:Nvm 我找到了它
      • 对于最多 3 个 ndim,八度音程中的 meshgrid 做同样的工作
      • meshgrid 似乎可以置换尺寸,而 ndgrid 不会
      猜你喜欢
      • 1970-01-01
      • 2012-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多