获得八度/ matlab中的索引矩阵

时间:2013-05-19 02:25:55

标签: matlab matrix octave vectorization indices

在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)矩阵的解决方案

2 个答案:

答案 0 :(得分: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()编写自定义包装器,将其转换为您要查找的函数格式。

答案 1 :(得分: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