【问题标题】:Use randperm in a matrix in MATLAB在 MATLAB 的矩阵中使用 randperm
【发布时间】:2017-04-20 15:31:39
【问题描述】:

我有一个名为“featureMatrix”的矩阵。使用size(featureMatrix) 结果是:11843 720。我想使用 randperm 洗牌这个矩阵的内容。首先,我使用rng(1) 选择种子。然后我使用 randperm:featureMatrixRnd = featureMatrix(randperm(length(featureMatrix))');。但效果并不好。事实上,如果我写 size(featureMatrixRnd) 我得到 11843 1,而不是 11843 720。为什么?

【问题讨论】:

  • 为什么使用长度而不是大小或数字作为 randperm 的输入

标签: matlab matrix random


【解决方案1】:

因为您使用了length,它选择了最长的维度。首先使用numel 而不是length 来获取所有元素,然后reshape 恢复到原来的大小:

OrgSize = size(featureMatrix);
featureMatrixRnd = randperm(numel(featureMatrix));
out = reshape(featureMatrix(featureMatrixRnd),OrgSize);

【讨论】:

    【解决方案2】:

    这个答案类似于Adriaan's,但不需要reshape:

    featureMatrix(:) = featureMatrix(randperm(numel(featureMatrix)));
    

    【讨论】:

    • 您必须为此在某处启动featureMatrixRnd,并实际索引到原始featureMatrix
    • 这种方式不起作用。大小的结果是 ans = 83137860 1
    • @Adriaan 哎呀,你说得对,我没有注意到输出矩阵的名称与输入不同,虽然我都命名为 featureMatrixRnd... 我更新了答案,但是它不再适合这个问题,因为它将输出分配给输入矩阵....
    • 当然,您可以做的是首先确定featureMatrixRnd = featureMatrix;,然后按照您的方式覆盖那个。那你就保留原件吧。
    【解决方案3】:

    这是最好的解决方案:

    rng(1);
    idx = randperm(size(featureMatrix,1));
    outfeatureMatrixRnd = featureMatrix(idx,:);
    

    使用

    OrgSize = size(featureMatrix);
    featureMatrixRnd = randperm(numel(featureMatrix));
    out = reshape(featureMatrix(featureMatrixRnd),OrgSize);
    

    不好,因为我不需要独立洗牌

    【讨论】:

    • 您要求对整个矩阵进行洗牌,这是其他答案所做的。在您发布问题后更改要求在这里不太受欢迎。
    猜你喜欢
    • 2014-12-16
    • 1970-01-01
    • 2011-12-08
    • 2015-07-10
    • 2013-08-08
    • 2022-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多