将矩阵运算应用于n-dim矩阵中的每个k-dim行

时间:2013-07-10 01:24:02

标签: multidimensional-array matrix function-pointers octave matrix-multiplication

octave是否有一种方法可以使用一个适用于二维矩阵中每列的函数并将其转换为适用于n维矩阵中第k维的每一行的函数?

作为一个例子,这里我有一个函数,它对矩阵中的每一列进行缩放,使最小值为零,最大值为1:

function [res] = normalizeColRange(m)
    nrows = size(m,1);

    maxes = max(m,[],1);
    mins = min(m,[],1);

    res = [speye(nrows), -ones(nrows,1)] * [m; mins] / diag(maxes - mins);
endfunction

现在我正在寻找一个函数(我将其命名为operateDim),这样如果我想以相同的方式缩放4维矩阵(m)中的每个dim-3行,我可以说:

res = operateDim(@normalizeColRange,m,3);

并返回一个相同大小的四维矩阵,其中所有条目都沿着维度3缩放。换句话说:

min(res,[],3) == 0

max(res,[],3) == 1

更简单的输入函数就是矩阵乘法。即:

res = operateDim(@(M) A * M, m, 3)

会将m的每个d-3行视为矩阵中的一列,并将A与该列相乘,以便

reshape(permute(res,[3,1,2,4]),size(res,3),[]) ==
A * reshape(permute(m,[3,1,2,4]),size(m,3),[])

1 个答案:

答案 0 :(得分:0)

这是我创建operationsDim的尝试。它看起来有点冗长,我想知道它是否适合更一般的范例,或者这个函数是否已经存在于八度音阶库中:

function [res] = operateDim(f,m,d):
    p = 1:ndims(m);
    p([1,d]) = [d,1];
    m = permute(m, p);
    nsizes = size(m);
    m = reshape(m, nsizes(1), []);
    res = f(m);
    assert(ndims(res) <= 2);
    nsizes(1) = size(res,1);
    assert(size(res,2) == size(m,2));
    res = reshape(res, nsizes);
    res = permute(res, p);
endfunction