简体   繁体   English

如何不使用Matlab / Octave在数组中重复值

[英]How not to repeat values in array using matlab / octave

Thanks goes out to Shai for getting my code to be much more efficient. 感谢Shai协助我提高代码效率。 The link to the original thread is here. 原始线程的链接在这里。 Original Thread 原始线程

How can I have a loop check and stop if a number in the "array_all" array has been repeated from the "x" array. 如果已经从“ x”数组中重复了“ array_all”数组中的数字,如何进行循环检查并停止。

Example: 例:

Here's the code below: 这是下面的代码:

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);

The output is: 输出为:

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

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? 我们遇到了1.0000 0.5000 0.2500的问题,我们知道这是由于它在先前检查array_all数组时发现了数字1.0000,但如何解决呢?

The array we are trying to get is below: 我们尝试获取的数组如下:

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: The numbers will not be this simple there will be thousands of values. PS:数字不会那么简单,会有成千上万的值。 And I won't know when they will repeat. 而且我不知道他们什么时候会重复。

Ps: I'm using octave 3.8.1 附:我正在使用八度3.8.1

Using a loop 使用循环

%// create the data
x=[9,8,7,6,5,4,3,2,1]
array_all = bsxfun( @times, x(:), [1 .5 .25] );

Start pruning 开始修剪

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

Now leave only valid entries 现在仅保留有效条目

array_all = array_all(valid, : );

You can try this out at ideone . 您可以在ideone上尝试一下

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM