Hi there,

I needed a version of setdiff  C=A - B that would return the indices I
in A such that C=A(I), so I wrote one. I think it would be useful to
have this feature in octave's setdiff.

Here it goes:

function [c,idx] = setdiff2(a,b)

%
if (isempty(a))
    c = [];
    idx=[];
elseif (isempty(b))
    c = a;
    idx=1:length(a);
else
%    temp = zeros(1, max(max(a), max(b))); %non-sparse version
    temp = sparse([], [],0,1,max(max(a), max(b)));
    temp(a) = 1;
    temp(b) = 0;

    G = temp(a)==1; % Without this intermediate results, I get SEGV
when batch running too
    F = full(G);

    idx = find(F);
    c = a(idx);
end

The non-sparse version runs just fine for me, but it will allocate too
much memory if any number of a or b is big, hence I tried to use
sparse matrices. The code as it stands runs ok when in batch mode with
hand input line-by-line. However, when I try to run the function I get
this:

octave:1> setdiff2([1 3 4 5 6 7 9],[3 6 7])
*** glibc detected *** octave: free(): invalid next size (fast):
0x00000000018eb860 ***
======= Backtrace: =========
/lib/libc.so.6[0x2b0c026a8a58]
/lib/libc.so.6(cfree+0x76)[0x2b0c026ab0a6]
/usr/lib/octave-3.0.1/liboctave.so(_ZN6SparseIdED2Ev+0xc3)[0x2b0bfe6fe5a3]
/usr/lib/octave-3.0.1/liboctinterp.so(_ZN20octave_sparse_matrixD0Ev+0x38)[0x2b0bfddb6a18]
/usr/lib/octave-3.0.1/liboctinterp.so(_ZN13symbol_record5clearEv+0x192)[0x2b0bfdc293b2]
/usr/lib/octave-3.0.1/liboctinterp.so(_ZN12symbol_table5clearEv+0x150)[0x2b0bfdc29d70]
/usr/lib/octave-3.0.1/liboctinterp.so(_ZN14unwind_protect9run_frameERKSs+0x82)[0x2b0bfdc45332]
/usr/lib/octave-3.0.1/liboctinterp.so(_ZN20octave_user_function17do_multi_index_opEiRK17octave_value_list+0x647)[0x2b0bfdd09957]
/usr/lib/octave-3.0.1/liboctinterp.so(_ZN20octave_user_function7subsrefERKSsRKSt4listI17octave_value_listSaIS3_EEi+0x12d)[0x2b0bfdd08cbd]
/usr/lib/octave-3.0.1/liboctinterp.so(_ZN12octave_value7subsrefERKSsRKSt4listI17octave_value_listSaIS3_EEi+0x145)[0x2b0bfdcc5f75]
/usr/lib/octave-3.0.1/liboctinterp.so(_ZN21tree_index_expression6rvalueEi+0x6d4)[0x2b0bfddd56e4]
/usr/lib/octave-3.0.1/liboctinterp.so(_ZN14tree_statement4evalEbib+0x2b2)[0x2b0bfddf59d2]
/usr/lib/octave-3.0.1/liboctinterp.so(_ZN19tree_statement_list4evalEbi+0x159)[0x2b0bfddf5c09]
/usr/lib/octave-3.0.1/liboctinterp.so(_Z9main_loopv+0xd2)[0x2b0bfdc401c2]
/usr/lib/octave-3.0.1/liboctinterp.so(octave_main+0x1005)[0x2b0bfdbde3b5]
/lib/libc.so.6(__libc_start_main+0xe6)[0x2b0c0264d466]
octave[0x4007e9]
======= Memory map: ========
00400000-00401000 r-xp 00000000 08:06 1894679
  /usr/bin/octave-3.0.1
00600000-00601000 r--p 00000000 08:06 1894679
  /usr/bin/octave-3.0.1
00601000-00602000 rw-p 00001000 08:06 1894679
  /usr/bin/octave-3.0.1
00755000-024ce000 rw-p 00755000 00:00 0                                  [heap]
2b0bfd63c000-2b0bfd65b000 r-xp 00000000 08:06 2199216
  /lib/ld-2.8.90.so
2b0bfd65b000-2b0bfd65e000 rw-p 2b0bfd65b000 00:00 0
2b0bfd85a000-2b0bfd85b000 r--p 0001e000 08:06 2199216
  /lib/ld-2.8.90.so
2b0bfd85b000-2b0bfd85c000 rw-p 0001f000 08:06 2199216
  /lib/ld-2.8.90.so
2b0bfd85c000-2b0bfe19e000 r-xp 00000000 08:06 163674
  /usr/lib/octave-3.0.1/liboctinterp.so.3.0.1
2b0bfe19e000-2b0bfe39d000 ---p 00942000 08:06 163674
  /usr/lib/octave-3.0.1/liboctinterp.so.3.0.1
2b0bfe39d000-2b0bfe3c6000 r--p 00941000 08:06 163674
  /usr/lib/octave-3.0.1/liboctinterp.so.3.0.1
2b0bfe3c6000-2b0bfe3d4000 rw-p 0096a000 08:06 163674
  /usr/lib/octave-3.0.1/liboctinterp.so.3.0.1
2b0bfe3d4000-2b0bfe3d7000 rw-p 2b0bfe3d4000 00:00 0
2b0bfe3d7000-2b0bfeb74000 r-xp 00000000 08:06 163673
  /usr/lib/octave-3.0.1/liboctave.so.3.0.1
2b0bfeb74000-2b0bfed74000 ---p 0079d000 08:06 163673
  /usr/lib/octave-3.0.1/liboctave.so.3.0.1
2b0bfed74000-2b0bfed79000 r--p 0079d000 08:06 163673
  /usr/lib/octave-3.0.1/liboctave.so.3.0.1
2b0bfed79000-2b0bfed7f000 rw-p 007a2000 08:06 163673
  /usr/lib/octave-3.0.1/liboctave.so.3.0.1
2b0bfed7f000-2b0bfed85000 rw-p 2b0bfed7f000 00:00 0
2b0bfed85000-2b0bfede7000 r-xp 00000000 08:06 163672
  /usr/lib/octave-3.0.1/libcruft.so.3.0.1
2b0bfede7000-2b0bfefe6000 ---p 00062000 08:06 163672
  /usr/lib/octave-3.0.1/libcruft.so.3.0.1
2b0bfefe6000-2b0bfefe7000 r--p 00061000 08:06 163672
  /usr/lib/octave-3.0.1/libcruft.so.3.0.1
2b0bfefe7000-2b0bfefe9000 rw-p 00062000 08:06 163672
  /usr/lib/octave-3.0.1/libcruft.so.3.0.1
2b0bfefe9000-2b0bfefea000 rw-p 2b0bfefe9000 00:00 0
2b0bff005000-2b0bff006000 rw-p 2b0bff005000 00:00 0
2b0bff006000-2b0bff0b0000 r-xp 00000000 08:06 1896324
  /usr/lib/libumfpack.so.3.1.0
2b0bff0b0000-2b0bff2b0000 ---p 000aa000 08:06 1896324
  /usr/lib/libumfpack.so.3.1.0
2b0bff2b0000-2b0bff2b1000 rw-p 000aa000 08:06 1896324
  /usr/lib/libumfpack.so.3.1.0
2b0bff2b1000-2b0bff2b9000 r-xp 00000000 08:06 1896314
  /usr/lib/libamd.so.3.1.0
2b0bff2b9000-2b0bff4b8000 ---p 00008000 08:06 1896314
  /usr/lib/libamd.so.3.1.0
2b0bff4b8000-2b0bff4b9000 rw-p 00007000 08:06 1896314
  /usr/lib/libamd.so.3.1.0
2b0bff4b9000-2b0bff4c2000 r-xp 00000000 08:06 1896315
  /usr/lib/libcamd.so.3.1.0
2b0bff4c2000-2b0bff6c1000 ---p 00009000 08:06 1896315
  /usr/lib/libcamd.so.3.1.0
2b0bff6c1000-2b0bff6c2000 rw-p 00008000 08:06 1896315
  /usr/lib/libcamd.so.3.1.0
2b0bff6c2000-2b0bff6c3000 rw-p 2b0bff6c2000 00:00 0
2b0bff6c3000-2b0bff6c9000 r-xp 00000000 08:06 1896318
  /usr/lib/libcolamd.so.3.1.0
2b0bff6c9000-2b0bff8c8000 ---p 00006000 08:06 1896318
  /usr/lib/libcolamd.so.3.1.0
2b0bff8c8000-2b0bff8c9000 rw-p 00005000 08:06 1896318
  /usr/lib/libcolamd.so.3.1.0
2b0bff8c9000-2b0bff9a9000 r-xp 00000000 08:06 1896323
  /usr/lib/libcholmod.so.3.1.0
2b0bff9a9000-2b0bffba8000 ---p 000e0000 08:06 1896323
  /panic: Aborted -- stopping myself...
G =

Compressed Column Sparse (rows = 1, cols = 7, nnz = 4)

  (1, 1) ->  1
  (1, 3) ->  1
  (1, 4) ->  1
  (1, 7) ->  1

F =

   1   0   1   1   0   0   1

idx =

   1   3   4   7

attempting to save variables to `octave-core'...
save to `octave-core' complete

I have removed all the semicolons after G to get more verbosity.

I'm running Ubuntu intrepid, with octave version 3.0.1-6ubuntu1

I know it might not be the last one, but I'm not willing to change my
production environment to test such a simple bug, so if a helpful hand
could just try it on the latest version, it would be helpful.

Thanks!

------------------------------------------------------------------------------
Register Now & Save for Velocity, the Web Performance & Operations 
Conference from O'Reilly Media. Velocity features a full day of 
expert-led, hands-on workshops and two days of sessions from industry 
leaders in dedicated Performance & Operations tracks. Use code vel09scf 
and Save an extra 15% before 5/3. http://p.sf.net/sfu/velocityconf
_______________________________________________
Octave-dev mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/octave-dev

Reply via email to