0

给定 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 维的索引替换?(与上述问题相同,但仅适用于非零元素)

理想情况下,我正在寻找一种针对八度音程进行良好矢量化的方法(这意味着它不会显式循环任何内容)

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

4

2 回答 2

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() 编写自定义包装器,以将其转换为您正在寻找的函数格式。

于 2013-05-19T03:12:09.163 回答
0

万一有人好奇,因为我不知道 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
于 2013-05-19T03:25:26.113 回答