Matlab: перебор массива

Это мой одномерный массив A. содержащий 10 чисел

A = [-8.92100000000000 10.6100000000000 1.33300000000000 ...
     -2.57400000000000 -4.52700000000000 9.63300000000000 ...
     4.26200000000000 16.9580000000000 8.16900000000000 4.75100000000000];

Я хочу, чтобы цикл проходил так; (вычисление среднего интервала) - Длина интервала 2,4,8

  1. (a(1)+a(2))/2 - значение, хранящееся в одном блоке матрицы, скажем, m = нули (10)
  2. затем (a(1)+a(2)+a(3)+a(4))/4 ------ означает -----
  3. затем (a(1)+a(2)..... a(8))/8

затем сдвиньте индекс;

  1. (a(2)+a(3))/2; - значит
  2. (a(2)+a(3)+a(4)+a(5))/4
  3. (a(2)+a(3)...a(9))/8

ТАК в основном интервал длины 2^n


person Harsh Sharma    schedule 15.06.2015    source источник
comment
Всего будет 19 средних значений.   -  person Harsh Sharma    schedule 15.06.2015
comment
Стандартное отклонение и кодисперсия тоже! из этих интервалов   -  person Harsh Sharma    schedule 15.06.2015
comment
у меня сейчас матрица 64х256. мне нужно вычислить mean_2 для первой строки отдельно, затем для второй строки, и теперь im2col, кажется, идет вниз по столбцу, я хочу, чтобы он шел по строкам?   -  person Harsh Sharma    schedule 22.06.2015


Ответы (1)


Вы можете сделать это, используя conv без циклов.

avg_2 = mean([A(1:end-1);A(2:end)])

avg_4 = conv(A,ones(1,4)/4,'valid')

avg_8 = conv(A,ones(1,8)/8,'valid')

Выходные данные для образца Входные данные:

avg_2 =
0.8445    5.9715   -0.6205   -3.5505    2.5530    6.9475   10.6100   12.5635    6.4600

avg_4 =
0.1120    1.2105    0.9662    1.6985    6.5815    9.7555    8.5350

avg_8 =
3.3467    5.4830    4.7506

Поиск стандартного отклонения для примера (std_4)

%// each 1x4 sliding sub-matrix is made a column
%// for eg:- if A is 1x6 you would get 1-2-3-4, 2-3-4-5, 3-4-5-6 each as a column
%// ending with 3 columns. for 1x10 matrix, you would get 7 columns
reshaped_4 = im2col(A,[1 4],'sliding');    %// change 4 to 2 or 8 for other examples

%// calculating the mean of every column
mean_4 = mean(reshaped_4);

%// Subtract each value of the column with the mean value of corresponding column
out1 = bsxfun(@minus,reshaped_4,mean_4);

%// finally element-wise squaring, mean of each column 
%// and then element-wise sqrt to get the output.
std_4 = sqrt(mean(out1.^2))

Выходные данные для образца Входные данные:

std_4 =

7.0801    5.8225    5.4304    5.6245    7.8384    4.5985    5.0906

Полный код для OP

clc;
clear;
close all;

A = [-8.92100000000000 10.6100000000000 1.33300000000000 ...
     -2.57400000000000 -4.52700000000000 9.63300000000000 ...
     4.26200000000000 16.9580000000000 8.16900000000000 4.75100000000000];

reshaped_2 = im2col(A,[1 2],'sliding'); %// Length Two 
mean_2 = mean(reshaped_2); 
out1 = bsxfun(@minus,reshaped_2,mean_2); 
std_2 = sqrt(mean(out1.^2)) 
reshaped_4 = im2col(A,[1 4],'sliding'); %// Four 
mean_4 = mean(reshaped_4); 
out1 = bsxfun(@minus,reshaped_4,mean_4); 
std_4 = sqrt(mean(out1.^2)) 
reshaped_8 = im2col(A,[1 8],'sliding'); %// Eight 
mean_8 = mean(reshaped_8); 
out1 = bsxfun(@minus,reshaped_8,mean_8); 
std_8 = sqrt(mean(out1.^2))
person Santhan Salai    schedule 15.06.2015
comment
Индексы нижнего индекса должны быть либо действительными положительными целыми числами, либо логическими. - Ошибка? - person Harsh Sharma; 15.06.2015
comment
Что, если у меня есть несколько рядов чисел, для этого мне понадобится цикл, да? - person Harsh Sharma; 15.06.2015
comment
@HarshSharma Существует conv2 для двумерных массивов и convn для многомерных массивов. Вам не нужна петля!! ;) - person Santhan Salai; 15.06.2015
comment
@HarshSharma, ха-ха! дополнительные примеры см. в этом кстати. Если вы найдете этот ответ полезным, рассмотрите возможность принятия этого ответа - person Santhan Salai; 15.06.2015
comment
@HarshSharma - conv фактически используется для полиномиального умножения. Это одно из самых распространенных применений, так что вы правы. - person rayryeng; 15.06.2015
comment
@rayryeng Тогда как здесь используется conv(), это сбивает с толку. - person Harsh Sharma; 15.06.2015
comment
@HarshSharma - В этом случае вы можете рассматривать свой ввод как выражение полинома nth порядка, полиномиально умноженного на полином mth порядка всех 1/4 или 1/8, если m=4 or 8. Вот как вы могли бы посмотреть на это математически... но с точки зрения обработки сигналов вы собираете окна из 4 или 8 значений, находите среднее значение в этом окне и устанавливаете его на выходе. Лучше всего думать об этом в контексте обработки сигналов. Не смотрите на это в полиномиальном контексте... это просто бонус. - person rayryeng; 15.06.2015
comment
@HarshSharma Вот пример: x = [1 2 1], y = [1 1]. Используя conv, вы можете представить это как (x^2 + 2x + 1)*(x + 1) = x^3 + 3x^2 + 3x + 1. Выполнение z = conv(x, y) дает вам [1 3 3 1]. Результатом являются полиномиальные коэффициенты умножения, как только вы закончите. Как я уже сказал, не думайте об этом с точки зрения полиномиального умножения. Посмотрите на это с точки зрения обработки сигналов. Это легче понять. - person rayryeng; 15.06.2015
comment
да, я думаю, что это правильно, но он все еще показывает мне, что индексы индексов должны быть либо реальными положительными целыми числами, либо логическими. - person Harsh Sharma; 16.06.2015
comment
@HarshSharma у вас есть имя переменной mean в вашей рабочей области? Добавьте clear перед кодом, создайте новый скрипт и повторите. обновленный код, я думаю, теперь он будет работать - person Santhan Salai; 16.06.2015
comment
@SanthanSalai - Привет, чувак. у меня сейчас матрица 62х256. мне нужно вычислить mean_2 для первой строки отдельно, затем для второй строки, и теперь im2col, кажется, идет вниз по столбцу, я хочу, чтобы он шел по строкам? - person Harsh Sharma; 22.06.2015
comment
@SanthanSalai 64x256* - person Harsh Sharma; 22.06.2015