Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 每列保留n个最大值,其余值在MATLAB中设置为零,无需循环_Arrays_Matlab_Sorting_Indexing_Vectorization - Fatal编程技术网

Arrays 每列保留n个最大值,其余值在MATLAB中设置为零,无需循环

Arrays 每列保留n个最大值,其余值在MATLAB中设置为零,无需循环,arrays,matlab,sorting,indexing,vectorization,Arrays,Matlab,Sorting,Indexing,Vectorization,我有一个未排序的数字矩阵,我想保持每列的n个最大值(不一定是唯一的),并将其余值设置为零 我想出了如何通过循环来实现这一点: a = [4 8 12 5; 9 2 6 18; 11 3 9 7; 8 9 12 4] k = 2 for n = 1:4 [y, ind] = sort(a(:,n), 'descend'); a(ind(k+1:end),n) = 0; end a 这给了我: a= k= a= 然而,当我试图消除循环时,我似乎无法正确地建立索引,因为: a =

我有一个未排序的数字矩阵,我想保持每列的n个最大值(不一定是唯一的),并将其余值设置为零

我想出了如何通过循环来实现这一点:

a = [4 8 12 5; 9 2 6 18; 11 3 9 7; 8 9 12 4]
k = 2

for  n = 1:4
    [y, ind] = sort(a(:,n), 'descend');
    a(ind(k+1:end),n) = 0;
end
a
这给了我: a=

k=

a=

然而,当我试图消除循环时,我似乎无法正确地建立索引,因为:

a = [4 8 12 5; 9 2 6 18; 11 3 9 7; 8 9 12 4]
k = 2

[y, ind] = sort(a, 'descend');
b = ind(k+1:end,:)
a(b) = 0
这给了我:(这不是我想做的) a=

k=

b=

a=

我错了吗?我必须使用循环吗


我引用这个问题是为了开始,但这并不是我想要做的:

你很接近了<
sort
函数中的code>ind为您提供了每列的行位置,该特定值将出现在已排序的输出中。如果要正确地索引到矩阵中并消除条目,则需要做一些额外的工作。您知道,对于
I
的每一列,这告诉您需要从该特定列中删除这些条目。因此,我要做的是使用
I
的每一列作为我们需要消除的行来生成列主要线性索引

尝试这样做:

a = [4 8 12 5; 9 2 6 18; 11 3 9 7; 8 9 12 4];
k = 2;
[y, ind] = sort(a, 'descend');

%// Change here
b = sub2ind(size(a), ind(k+1:end,:), repmat(1:size(a,2), size(a,1)-k, 1));
a(b) = 0;
我们使用来帮助我们生成列主索引,其中行由
ind
k
th元素后的值表示,我们需要的列用于该矩阵中的每一列。排序后截断
k
值后,还有
size(a,1)-k
行剩余,因此我们生成的列值从1到
a
中的列数,以及剩余行数

我们得到这个输出:

>> a

a =

     0     8    12     0
     9     0     0    18
    11     0     0     7
     0     9    12     0
这里有一个-

样本运行-

a =
     4     8    12     5
     9     2     6    18
    11     3     9     7
     8     9    12     4
n =
     2
ind =
     3     4     1     2
     2     1     4     3
     4     3     3     1
     1     2     2     4
rem_ind =
     4     7    11    13
     1     6    10    16
a =
     0     8    12     0
     9     0     0    18
    11     0     0     7
     0     9    12     0

ind和I应该是同一个变量吗?@ErinGoBragh-不用担心。让我知道这是否对你有效!成功了!谢谢,我只是想不出最后一点索引。@ErinGoBragh-我的荣幸:)是的,我不得不花几分钟的时间在MATLAB上转来转去,直到把它弄好。相信我,我第一次尝试也没有成功!我还以为你给我留了一个bsxfun呢!;)我的解决方案和你的一样。
 4     8    12     5
 9     2     6    18
11     3     9     7
 8     9    12     4
 2
 4     3     3     1
 1     2     2     4
 0     8    12     5
 0     2     6    18
 0     3     9     7
 0     9    12     4
a = [4 8 12 5; 9 2 6 18; 11 3 9 7; 8 9 12 4];
k = 2;
[y, ind] = sort(a, 'descend');

%// Change here
b = sub2ind(size(a), ind(k+1:end,:), repmat(1:size(a,2), size(a,1)-k, 1));
a(b) = 0;
>> a

a =

     0     8    12     0
     9     0     0    18
    11     0     0     7
     0     9    12     0
%// Get descending sorting indices per column
[~, ind] = sort(a,1, 'descend')

%// Get linear indices that are to be set to zeros and set those in a to 0s
rem_ind = bsxfun(@plus,ind(n+1:end,:),[0:size(a,2)-1]*size(a,1))
a(rem_ind) = 0
a =
     4     8    12     5
     9     2     6    18
    11     3     9     7
     8     9    12     4
n =
     2
ind =
     3     4     1     2
     2     1     4     3
     4     3     3     1
     1     2     2     4
rem_ind =
     4     7    11    13
     1     6    10    16
a =
     0     8    12     0
     9     0     0    18
    11     0     0     7
     0     9    12     0