如何不使用MATLAB /八度重复数组值 [英] How not to repeat values in array using matlab / octave
问题描述
感谢出去晒获取我的code要有效得多。原来的线程的链接在这里。
<一href=\"http://stackoverflow.com/questions/28263795/numerical-grouping-using-matlab-octave-and-not-repeating-values-found-in-main\">Original螺纹
Thanks goes out to Shai for getting my code to be much more efficient. The link to the original thread is here. Original Thread
我怎么能有一个循环检查,并停止,如果已经从X阵列重复array_all阵列中的一个数字。
例如:
下面是低于code:
x=[9,8,7,6,5,4,3,2,1]
array_all = bsxfun( @times, x(:), [1 .5 .25] ) %// generate for all values
eq_ = bsxfun( @eq, array_all, permute( x(:), [3 2 1] ) );
eq_ = max( eq_, [], 2 ); %// we do not care at which column of array_all x appeared
[mx firstRowToAppearIn] = max( squeeze(eq_), [], 1 );
toBePruned = 1:numel(x) > firstRowToAppearIn; %// prune elements that appear in array_all in a row preceding their location in x
pruned_array=array_all;
pruned_array(toBePruned,:) = []; %// remove those lines
st = struct();
for ii=1:size(pruned_array,1)
nm = sprintf('array_dyn_name%d',ii);
st.(nm) =pruned_array(ii,:);
end
pruned_array
fprintf('\nfinally Done-elapsed time -%4.4fsec- or -%4.4fmins- or -%4.4fhours-\n',toc,toc/60,toc/3600);
输出是:
array_all =
9.00000 4.50000 2.25000
8.00000 4.00000 2.00000
7.00000 3.50000 1.75000
6.00000 3.00000 1.50000
5.00000 2.50000 1.25000
4.00000 2.00000 1.00000
3.00000 1.50000 0.75000
2.00000 1.00000 0.50000
1.00000 0.50000 0.25000
pruned_array =
9.0000 4.5000 2.2500
8.0000 4.0000 2.0000
7.0000 3.5000 1.7500
6.0000 3.0000 1.5000
5.0000 2.5000 1.2500
我们碰到有问题的 1.0000 0.5000 0.2500 :我们知道这是由于这样的事实,它发现在数组的previous检查数1.0000 array_all ,但我们如何解决这个问题?
We run into problems with 1.0000 0.5000 0.2500 we know it's due to the fact that it found the number 1.0000 in a previous check of the array array_all but how can we fix it?
我们正在试图获得该数组是如下:
pruned_array =
pruned_array =
9.0000 4.5000 2.2500
8.0000 4.0000 2.0000
7.0000 3.5000 1.7500
6.0000 3.0000 1.5000
5.0000 2.5000 1.2500
1.0000 0.5000 0.2500
PS:数字不会是这个简单的将有成千上万的价值观。我不知道什么时候他们会重复。
诗:我用八度3.8.1
Ps: I'm using octave 3.8.1
推荐答案
使用循环
%// create the data
x=[9,8,7,6,5,4,3,2,1]
array_all = bsxfun( @times, x(:), [1 .5 .25] );
开始修剪
n = numel(x);
valid = false(n,1); %// at first, only first line is valid
valid(1) = true;
for ii=2:n, %// first line is valid by default
valid(ii) = ~any( reshape( array_all( valid, : ),[],1) == x(ii) );
end
现在只留下有效的条目
array_all = array_all(valid, : );
您可以在 ideone 。
这篇关于如何不使用MATLAB /八度重复数组值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!