Как создать матрицу со смещенной версией отсчетов сигнала в Matlab? - PullRequest
2 голосов
/ 25 апреля 2019

У меня есть вектор размером 25001x1, который представляет одну из моих выборок сигнала, и я хочу создать матрицу таким образом, чтобы первый столбец матрицы был моим вектором или сигналом, а остальная часть каждого столбца - это сдвинутая версия исходного сигнала. или vector.which я делаю следующим образом (вектор 10x1 рассматривается для понимания цели), добавляя нули.

 y=[1 2 3 4 5 6 7 8  9 10 ]';

 A=zeros(10,10);

 for i=1:length(y)
 A(:,i)=y;
 y=[1 2 3 4 5 6 7 8  9 10 ]';
 y=[zeros(1,(i))';y(1:end-(i))];

 end  

, что приводит к следующему

>> A

 A =

 1     0     0     0     0     0     0     0     0     0
 2     1     0     0     0     0     0     0     0     0
 3     2     1     0     0     0     0     0     0     0
 4     3     2     1     0     0     0     0     0     0
 5     4     3     2     1     0     0     0     0     0
 6     5     4     3     2     1     0     0     0     0
 7     6     5     4     3     2     1     0     0     0
 8     7     6     5     4     3     2     1     0     0
 9     8     7     6     5     4     3     2     1     0
10     9     8     7     6     5     4     3     2     1

Теперь, когда я хочу сместить более одного элемента или добавить больше одного нуля, я сделал следующее

y=[1 2 3 4 5 6 7 8  9 10 11 ]';

A=zeros(11,11);

for i=1:length(y)
A(:,i)=y;
y=[1 2 3 4 5 6 7 8  9 10 11  ]';
y=[zeros(1,(i*2))';y(1:end-(i*2))];
if (i>=(length(y)/2))
    break;
end 


end 

, что приводит к следующему

>> A

A =

 1     0     0     0     0     0     0     0     0     0     0
 2     0     0     0     0     0     0     0     0     0     0
 3     1     0     0     0     0     0     0     0     0     0
 4     2     0     0     0     0     0     0     0     0     0
 5     3     1     0     0     0     0     0     0     0     0
 6     4     2     0     0     0     0     0     0     0     0
 7     5     3     1     0     0     0     0     0     0     0
 8     6     4     2     0     0     0     0     0     0     0
 9     7     5     3     1     0     0     0     0     0     0
10     8     6     4     2     0     0     0     0     0     0
11     9     7     5     3     1     0     0     0     0     0

Есть ли какой-нибудь обобщающий метод, который делает то же самое и то же самое без использования цикла for?

1 Ответ

1 голос
/ 25 апреля 2019

Ответ на первую часть вашего вопроса в этом другом вопросе . Самый быстрый способ там (не принятый ответ) заключается в следующем:

N = numel(A);
val = repmat([A(:);0],1,N).*bsxfun(@le,[1:N+1]',[N:-1:1]);
out = reshape(val(1:N*N),N,N);

Для MATLAB R2016b и новее мы можем модернизировать это:

N = numel(A);
val = repmat([A(:);0],1,N) .* ((1:N+1).' <= (N:-1:1));
out = reshape(val(1:N*N),N,N);

(Я просто заменил bsxfun(@le,x,y) на x<=y, поскольку несколько лет назад больше не было необходимости использовать bsxfun в этих случаях. Я также удалил избыточные операторы конкатенации [] и заменил ' с .', что более правильно для этого использования.)

По второй части вашего вопроса нам нужно обобщить приведенный выше код нетривиальным образом. Следующий код является результатом этого:

N = numel(A);
step = 2;          % Set this to however many zeros you want to add each column
indx = N:-step:1;
M = numel(indx);
val = (1:N+step).' <= indx; % use bsxfun(@le, (1:N+step).',indx) instead for older MATLAB
val = repmat([A(:);zeros(step,1)],1,M).* val;
out = reshape(val(1:N*M),N,[]);

Я заменил N:-1:1 на N:-step:1, это главное изменение. Мне также нужно было добавить step нулей к A вместо одного (это [A(:);zeros(step,1)], где раньше было [A(:);0]). И я везде изменил размеры, чтобы учесть меньший выходной массив.

Обратите внимание, что это не приводит к появлению пустых (полностью нулевых) столбцов. Чтобы добавить их, проще всего сделать:

out2 = zeros(N,N);
out2(:,1:size(out,2)) = out;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...