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

답변 (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

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

댓글을 달려면 로그인하십시오.

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

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.

댓글을 달려면 로그인하십시오.

Andrei Bobrov
Andrei Bobrov 2013년 11월 26일
편집: Andrei Bobrov 2013년 11월 26일
[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 2013년 11월 27일
편집: Roger Stafford 2013년 11월 27일
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)];

카테고리

도움말 센터File Exchange에서 Condensed Matter & Materials Physics에 대해 자세히 알아보기

질문:

2013년 11월 25일

편집:

2013년 11월 27일

Community Treasure Hunt

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

Start Hunting!

Translated by