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],

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 comentarios

It is not at all clear to me how d relates to a .
the first column indicates the value.The other columns show the indecis for ex. 5 exists in 1,2&7

Iniciar sesión para comentar.

Respuestas (4)

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 comentarios

There is not such command in Matlab(transforma)
There is once I defined it. Did you overlook the
function d = transforma(a)
statement where I defined it?
I want it in general case,like any matrix in this form

Iniciar sesión para comentar.

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 comentarios

I knew it . They are getting very close to finishing the Crystal Ball Toolbox. Sean, care to say when it will be released, or is it still a closely held secret?
It can be done without using find() at all, by using bsxfun(@eq) and logical indexing that against 1:length(a)
Thanks .Its working well ,just its too complicated.I will be so glad if you explain the main steps in 1 or 2 words
It works well in small matrices but if the matrix is big such as randi(700,10,20),I found a repetitions in one column while in my case this repetition is not desired.
6 1 2 12 15
10 3 7 18 0
4 4 5 9 0
1 6 16 0 0
2 8 19 13 0
7 10 11 0 0
8 13 0 0 0
5 14 20 0 0
3 17 20 0 0
the repetitions are normal in rows but forbidden in columns,so how to solve this problem.
20 is repeated in the third column
if you want to see the results and what I mean exactly ,just write your email to send you the results.
@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.

Iniciar sesión para comentar.

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

Categorías

Más información sobre Condensed Matter & Materials Physics en Centro de ayuda y File Exchange.

Preguntada:

el 25 de Nov. de 2013

Editada:

el 27 de Nov. de 2013

Community Treasure Hunt

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

Start Hunting!

Translated by