matlab 置换矩阵特定列中的值

kcugc4gi  于 2022-11-15  发布在  Matlab
关注(0)|答案(2)|浏览(244)

我正在尝试编写一个对数据集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中(如果我的措辞有意义)。

s5a0g9ez

s5a0g9ez1#

我不确定我是否完全理解这个问题,但我认为您想要做的是收集单元数组中的d置换矩阵,如下所示:

function perms = perms_of_(A)
    [n,d] = size(A);
    perms = cell(d,1);
    for j = 1:d
        perms{j} = A;
        perms{j}(:,j) = A(randperm(n),j);
    end
end
6vl6ewon

6vl6ewon2#

您不会在函数中返回结果。也就是说,您在函数中计算新的A,但不通过perms变量将其返回给调用者。做一些这样的事情:

A=[1,2,3 ; 7,8,9 ; 13,14,15]
perms = perms_of_(A) % save the result of the call in a variable
function A = perms_of_(A) % declare the return variable to be 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

这种对输入和输出使用相同变量名的语法有时会导致原地操作,具体取决于函数的调用方式。如果在调用方中没有使用特定的就地操作语法,则会向调用方返回一个深层副本。例如,在另一个函数中像这样调用该函数将允许就地操作:

function some_function
A=[1,2,3 ; 7,8,9 ; 13,14,15]
A = perms_of_(A) % save the result of the call in a variable

在对perms_of_()的调用中,上面使用A作为输入和输出,函数perms_of_()使用相同名称的变量作为输入和输出,而对perms_of_()的调用是从另一个函数内部进行的,因此原位操作可以由MATLAB完成。

相关问题