Copy elements to end of row vector - help needed!

조회 수: 2 (최근 30일)
Jeroen Vermeulen
Jeroen Vermeulen 2020년 7월 2일
댓글: dpb 2020년 7월 2일
Dear Matlab forum,
For my research I have a full EMG row matrix that includes stance and swing phases.
To make this easy to answer, I'll make an example:
Let's call the EMG matrix, matrix 'a', in which stance and swing phases are included. In matrix 'b', in the rows, the indices are mentioned of where the stance phase in matrix a will start and where the stance phase will stop. Here, that would be from row 1:2, row 4:5, row 7:8 etc.
Simply put I desire to write a row matrix 'c', where all the stance phase part will be pasted. In this example c should look like [10 10 20 30 40 40 50 60]'.
How should I define (???) to let the loop fill [c] as a row vector mentioned above? As I'm a novice in this topic, I hope you can help me out. At this point
[c] = [10 20 40 50
10 30 40 60]
and should look like [c] = [10 10 20 30 40 40 50 60];
Thanks,
Jerome
--------------------------------------------------------------------------------------------
a = [10 10 20 20 30 30 40 40 50 50 60 60 70 70 80 80 90 90]';
b = [1 4 7 10;
2 5 8 11];
c = []';
% test
c1 = a( b(1,1) : b(2,1),1 )
c2 = a( b(1,2) : b(2,2),1 )
c3 = a( b(1,3) : b(2,3),1 )
for i = 0 : 3
?????????????????????????
c (:,end+1) = a( b(1,1+i) : b(2,1+i), 1)
???????????????????????
end

채택된 답변

Rik
Rik 2020년 7월 2일
I don't fully understand your code, but looking to your results, this code should do.
a = [10 10 20 20 30 30 40 40 50 50 60 60 70 70 80 80 90 90]';
b = [1 4 7 10;
2 5 8 11];
c=a(b);
c=reshape(c,1,[])
  댓글 수: 3
Rik
Rik 2020년 7월 2일
편집: Rik 2020년 7월 2일
Your code is quite fragile. You're trying to expand you c vector with the end keyword, but you are only creating a single index. The code below generates a large enough c vector first, then loops through b, determining the indices into a and c separately.
a = [10 10 20 20 30 30 40 40 50 50 60 60 70 70 80 80 90 90]';
b = [1 4 7 10;
2 5 8 11];
clc
c=NaN(1,sum(1+diff(b)));
counter=0;
for n=1:size(b,2)
a_idx=b(1,n):b(2,n);
c_idx=counter+(1:numel(a_idx));
c(c_idx)=a(a_idx);
counter=c_idx(end);
end
As a further note: reshape is not very expensive in general, because normally it will only have to change the header of the variable.
Jeroen Vermeulen
Jeroen Vermeulen 2020년 7월 2일
Thanks for your clear answer Rik. Much appreciated, thanks for your help!

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

추가 답변 (1개)

dpb
dpb 2020년 7월 2일
A)
c=c(:).';
B)
" matrix 'a', in which stance and swing phases are included. In matrix 'b', in the rows, the indices are mentioned of where the stance phase in matrix a will start and where the stance phase will stop. Here, that would be from row 1:2, row 4:5, row 7:8 etc."
To extract the rows of 'b' from a' where 'b' is the pair of rows as above, consider that 'b' is everything except rows 3, 6, 9, ... use that fact:
b=a; % copy the original first
b(3:6:end,:)=[]; % remove unwanted rows
alternatively, can write
i1=[1:3:size(a,1)].; % vector of first rows of b (1, 4, 7, ...)
i2=i1+1; % and the next row after (2, 5, 8, ...)
b=a([i1;i2],:); % select rows from a for b
Note one can dispense with the explicit i2 variable above as well...
b=a([i1;i1+1],:); % select rows from a for b
creates i2 as temporary w/o explicit name.
Look up addressing operations in the "Getting Started" documentation
  댓글 수: 2
Jeroen Vermeulen
Jeroen Vermeulen 2020년 7월 2일
Thanks for your help, I only don't see how A) solves it!
dpb
dpb 2020년 7월 2일
You said
[c] = [10 20 40 50
10 30 40 60]
and should look like ...
[c] = [10 10 20 30 40 40 50 60];
That's what it does... (:) creates column vector, (.') transposes to row.

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

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

태그

제품


릴리스

R2018a

Community Treasure Hunt

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

Start Hunting!

Translated by