我正在尝试编写一个对数据集A执行一些计算的MATLAB函数。我希望该函数返回d(A的维数)矩阵,如A,但第j列元素已置换:
A=[1,2,3 ; 7,8,9 ; 13,14,15]
perms_of_(A)
function perms = perms_of_(A)
[n,d]=size(A); % number of rows and columns
for j = 1:d % permute the elements of column j
A(:,j) = A(randperm(n),j)
end
end
我想要这样的矩阵:
A=[7,2,3 ; 1,8,9 ; 13,14,15]
A=[1,14,3 ; 7,2,9 ; 13,8,15]
A=[1,2,9 ; 7,8,3 ; 13,14,15]
但我得到的却是:
A=[7,2,3 ; 1,8,9 ; 13,14,15]
A=[7,14,3 ; 1,2,9 ; 13,8,15]
A=[7,14,15 ; 1,2,9 ; 13,8,3]
换句话说,我想要的矩阵与原始矩阵A完全一样,只是第j列被置换了。不知何故,在每次迭代开始时,我需要将矩阵A重置为在函数外部定义的原始矩阵。列j-1、...、1上的排列出现在输出j中(如果我的措辞有意义)。
2条答案
按热度按时间s5a0g9ez1#
我不确定我是否完全理解这个问题,但我认为您想要做的是收集单元数组中的
d
置换矩阵,如下所示:6vl6ewon2#
您不会在函数中返回结果。也就是说,您在函数中计算新的A,但不通过perms变量将其返回给调用者。做一些这样的事情:
这种对输入和输出使用相同变量名的语法有时会导致原地操作,具体取决于函数的调用方式。如果在调用方中没有使用特定的就地操作语法,则会向调用方返回一个深层副本。例如,在另一个函数中像这样调用该函数将允许就地操作:
在对perms_of_()的调用中,上面使用A作为输入和输出,函数perms_of_()使用相同名称的变量作为输入和输出,而对perms_of_()的调用是从另一个函数内部进行的,因此原位操作可以由MATLAB完成。