如何不使用MATLAB /八度重复数组值 [英] How not to repeat values in array using matlab / octave

查看:121
本文介绍了如何不使用MATLAB /八度重复数组值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

感谢出去晒获取我的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆