I have the matrix a=[5 5 10 10 2 4 5],I want the result to be d=[5 1 2 7;10 3 4 0;2 5 0 0;4 6 0 0],

1 Ansicht (letzte 30 Tage)
I have the matrix
a=[5 5 10 10 2 4 5],
I want the result to be
d=[ 5 1 2 7;
10 3 4 0;
2 5 0 0;
4 6 0 0],
  3 Kommentare
yousef Yousef
yousef Yousef am 25 Nov. 2013
the first column indicates the value.The other columns show the indecis for ex. 5 exists in 1,2&7

Melden Sie sich an, um zu kommentieren.

Antworten (4)

Image Analyst
Image Analyst am 25 Nov. 2013
How about this:
a=[5 5 10 10 2 4 5]
d = transforma(a); % Call transforma() in the main program.
function d = transforma(a)
d=[ 5 1 2 7;
10 3 4 0;
2 5 0 0;
4 6 0 0];
It meets all the criteria you've given.
  4 Kommentare
Image Analyst
Image Analyst am 25 Nov. 2013
There is once I defined it. Did you overlook the
function d = transforma(a)
statement where I defined it?

Melden Sie sich an, um zu kommentieren.


Sean de Wolski
Sean de Wolski am 25 Nov. 2013
a=[5 5 10 10 2 4 5],
clear d;
[u,~,iy] = unique(a,'stable');
for ii = numel(u):-1:1
lhs = [u(ii) find(iy==ii).'];
d(ii,1:numel(lhs)) = lhs;
end
  6 Kommentare
yousef Yousef
yousef Yousef am 25 Nov. 2013
if you want to see the results and what I mean exactly ,just write your email to send you the results.
Sean de Wolski
Sean de Wolski am 26 Nov. 2013
Bearbeitet: Sean de Wolski am 26 Nov. 2013
@Walter, I'd be curious to time bsxfun(...) against find. I agree that any opportunity for a bsxfun, it should be used just 'cuz it's awesome.
@IA, you know how silent we are on future features :)
@Yousef, I do see the duplicated 20 in column two above. But I don't know how you got it. Please give me full reproduction steps.
When I run something like the following, it passes as I expect:
a = randi(700,[1 10000]);
% a=[5 5 10 10 2 4 5],
clear d;
[u,~,iy] = unique(a,'stable');
for ii = numel(u):-1:1
lhs = [u(ii) find(iy==ii).'];
d(ii,1:numel(lhs)) = lhs;
end
T = matlab.unittest.TestCase;
import matlab.unittest.constraints.IsEqualTo
T.verifyThat(ismember(1:numel(a),d(:,2:end)),IsEqualTo(true(1,numel(a))));
T.verifyThat(nnz(d(:,2:end)),IsEqualTo(numel(a)));
Interactive verification passed.
Interactive verification passed.

Melden Sie sich an, um zu kommentieren.


Andrei Bobrov
Andrei Bobrov am 26 Nov. 2013
Bearbeitet: Andrei Bobrov am 26 Nov. 2013
[a1,b,c] = unique(a(:),'first')
[~,ii] = sort(b);
a1 = a1(ii);
c = ii(c);
n = max(histc(c,(1:max(c))'));
f1 = @(x){[x(:)',zeros(1,n-numel(x))]};
p = accumarray(c,(1:numel(c))',[],f1)
out = [a1, cat(1,p{:})];
or with Nan
[a1,b,c] = unique(a(:),'first')
[~,ii] = sort(b);
a1 = a1(ii);
c = ii(c);
idx = bsxfun(@times,1:numel(a),bsxfun(@eq,a1,a));
idx(idx==0) = nan;
ii = sort(idx,2);
out = [a1,ii(:,~all(isnan(ii)))];

Roger Stafford
Roger Stafford am 27 Nov. 2013
Bearbeitet: Roger Stafford am 27 Nov. 2013
Here's another version. Let a be your array and d be the desired result.
[u,t,q] = unique(a(:),'first','stable');
[q,p] = sort(q);
r = p;
n = size(p,1);
r(p) = (1:n)';
t = r(t);
r = cumsum(1-accumarray(t(2:end),diff(t),[n,1]));
d = [i.accumarray([q,r],p)];

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by