0

octave 是否有一种方法,您可以通过该方法获取适用于二维矩阵中每一列的函数并将其转换为适用于沿 n 维矩阵中第 k 维的每一行的函数?

例如,这里我有一个函数可以缩放矩阵中的每一列,使最小值为零,最大值为一:

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

现在我正在寻找一个函数(我称之为operatedDim),这样如果我想以同样的方式缩放4维矩阵(m)中的每条dim-3线,我可以说:

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

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

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

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

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

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),[])
4

1 回答 1

0

这是我创建operatedDim 的尝试。它似乎有些冗长,我想知道它是否适合更通用的范例,或者八度库中是否已经存在这样的函数:

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
于 2013-07-10T01:24:02.123 回答