Создание многомерного сдвигающего массива с использованием подхода векторизации вместо цикла FOR - PullRequest
0 голосов
/ 13 апреля 2020

Я могу "векторизовать" команду circshift, но у меня возникают проблемы с добавлением к ней измерений.

См. Код ниже с , работающим ДЛЯ l oop, которое я пытаюсь выполнить векторизация с использованием измерений

clear all,clf reset,tic,clc , close all

function  [outMat] =  vectcircshift(vectToShift,shiftVector)
%This function generates a matrix where each row is a circshift of the
%original vector from the specified interval in the shiftVector;
%
%Inputs
%vectToShift:   is the original vector you want to circshift multiple times
%shiftVector:   is the vector of the circshift sizes;
%
%Outputs
%outMat:        is a matrix were every row is circshift by the amount in the
%               shiftVector
  [n,m]=size(vectToShift);
  if n>m
    inds=(1:n)';
    i=toeplitz(flipud(inds),circshift(inds,[1 0]));
    outMat=vectToShift(i(shiftVector,:));
    outMat=circshift(outMat,[0,-1]); %shift to include original signal first
  else
    inds=1:m;
    i=toeplitz(fliplr(inds),circshift(inds,[0 1]));
    outMat=vectToShift(i(shiftVector,:));
    outMat=circshift(outMat,[0,-1]); %shift to include original signal first
  end
end

%%----Working FOR LOOP below I'm trying to vectorize.
ndim=0;
ndim_tot=[1:3] %total dimensions
for ndim=1:length(ndim_tot)
  ndim=ndim+0
  if ndim==1
      array_sort(ndim,:)=circshift(ndim_tot,[0 ndim-1]) %start at row of sort array
  else
      array_sort(ndim,:)=circshift(ndim_tot,[0 mod(-ndim,length(ndim_tot))+1]) %next start of row of sort array

  endif
  array_sort= array_sort(ndim,:)
  array_dim(:,:,ndim)=vectcircshift([1:5],array_sort)
endfor

Я устал от приведенного ниже синтаксиса, но логика c не сработает.

ndim_tot=[1:3]; %number of dimensions
array_dim2(:,:,ndim_tot)=vectcircshift([1:5],[1:3])

Я получаю сообщение об ошибке с несогласованными аргументами (op1 равно 0x0x1, op2 равно 3x5)

Моя цель - создать многомерный массив, который смещает сигнал / массив, а также создает и сдвигает его в нескольких измерениях.

Example: of what the multidimensional array would look like
if I start with a signal / array a1=[1 2 3 4 5]

I'm trying to have it create.

array_dim(:,:,1)=
[
1 2 3 4 5
5 1 2 3 4
4 5 1 2 3
]

array_dim(:,:,2)=
[
5 1 2 3 4
4 5 1 2 3
1 2 3 4 5
]

array_dim(:,:,3)=
[
4 5 1 2 3
1 2 3 4 5
5 1 2 3 4
]

Обратите внимание: цифры не будет последовательным, я просто использовал его в качестве примера, чтобы помочь немного объяснить вещи.

PS: я использую Octave 4.2.2

1 Ответ

1 голос
/ 03 мая 2020

Непонятно, почему вы переходите в 3-м моде, но вот назначение oop с использованием shift

a1=[1 2 3 4 5];
array_dim=zeros(3,5,3);

for i=0:2
        array_dim(:,:,i+1)=[shift(a1,i);
                shift(a1,mod(i+1,3));
                shift(a1,mod(i+2,3))];
endfor

array_dim

, и выход соответствует вашему примеру

array_dim =

ans(:,:,1) =

   1   2   3   4   5
   5   1   2   3   4
   4   5   1   2   3

ans(:,:,2) =

   5   1   2   3   4
   4   5   1   2   3
   1   2   3   4   5

ans(:,:,3) =

   4   5   1   2   3
   1   2   3   4   5
   5   1   2   3   4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...