Я заметил, что функция movstd меняет размеры моей матрицы.
Мои входные данные — это матрица 3x5x100, а выходные — матрица 5x100x3. Я тестировал 3D-матрицы меньшего размера (2x3x5), и все работает нормально. Я что-то пропустил в документации?
Вот мой код:
clear; close all; clc;
xlist = 1:5;
ylist = (1:3)*10;
% Making a LUT from x and y : LUT --> nConf | x | y
count = 1;
for kx=1:length(xlist)
for ky=1:length(ylist)
LUT(count,:) = [count xlist(kx) ylist(ky)];
count = count+1;
end
end
% Making the data --> nConf | measurement
% data : 1 x1
% 2 x2
% ...
% 15 x15
% 1 x16
% 2 x17
% ...
Nrounds = 100;
data = zeros(Nrounds*length(LUT),2); % Let's have a multiple rounds/cycles measurements
data(:,2) = rand(length(data),1); % Random measurements
data(1:floor(Nrounds)*length(LUT),1) = repmat(LUT(:,1),[floor(Nrounds) 1]); % Fill the nConf column
% Parameter to compute a noise approximation
wlen = 3; % window length
opt = 0; %see movstd doc
%% Reshaping the data in a 3D matrix with each column in the third axis is a conf with Nrounds layers
Mdata_rs = reshape(data(:,2),[length(ylist) length(xlist) Nrounds]);
movSTDdata_rs = movstd(Mdata_rs,wlen,opt,3);
output1 = median(movSTDdata_rs,3); %Get a noise approximation ignoring the possible base line
Я запустил его с помощью Matlab, и проблем нет.
Я знаю, что могу обойти это, используя Mdata_rs
, чтобы получить правильный порядок, но мне хотелось бы знать, почему или хотя бы когда появляется такое поведение.
@CrisLuengo Ну и да, и нет. Я работал над одним и тем же кодом, но это две отдельные проблемы с разным поведением и последствиями.
Что ж, это прекрасно объясняет, почему этот код дает разные ответы в MATLAB и Octave. Кроме того, если код Octave не работает из-за замены измерений, возможно, он делает что-то еще неправильно.
Обратите внимание, что movSTDdata_rs = reshape(movSTDdata_rs,[length(ylist) length(xlist) Nrounds]);
в вашем связанном коде не решает проблему перепутанных размеров. reshape
не меняет размеры. Вы можете проверить, используете ли вы Octave, и использовать permute
, чтобы упорядочить размеры, как в результате MATLAB.
@CrisLuengo Ты прав. В общем-то это не сработает, но в моем случае получается :-)
Нет, в вашем случае это тоже не работает. Вы думаете, что да, но это не так. Если бы это сработало, вы, вероятно, не получили бы разных результатов в MATLAB и Octave.
похоже, это влияет на все функции movX. вы можете просто сделать: a = rand(3,6,4); movmean(a,3,1), movmean(a,3,2), movmean(a,3,3)
чтобы увидеть, что когда dim равен 3, форма возврата неверна. Я думаю, что эти функции выполняют внутреннюю перестановку, чтобы всегда перемещать рабочее измерение в одно и то же измерение с перестановкой в конце. наверное там что-то не так. следует подать отчет на bugs.octave.org
@NickJ Да, movfun меняет тусклое значение на первое, а затем возвращает его обратно. Однако я не мог понять, правильно это было сделано или нет. Дело в том, что, похоже, это не всегда так.
отправлен отчет об ошибке
Похоже, что в movefun
(вызываемом movstd
, movmean
и т. д.) в Octave 9.2.0 есть ошибка. Функция изменяет форму/перестановку входных данных, выравнивая их до 2D, и помещает рабочее измерение в столбцы для упрощения кодирования оконных операций. Функция завершается восстановлением формы, сначала путем ее разглаживания с помощью reshape
, а затем путем изменения тусклой перестановки. К сожалению, похоже, что в коде следовало использовать ipermute
, а не permute
, и эта проблема возникала только при работе с dim
> 2, и не было никаких самопроверок для данных nD, чтобы выявить эту проблему.
Отчет об ошибке был открыт по адресу https://savannah.gnu.org/bugs/index.php?65927
Надеемся, это будет исправлено до версии 9.3.0. Между тем, похоже, что правильную функциональность вашего кода можно восстановить, изменив строку 297 с:
y = permute (y, [dperm, nd+1]);
к
y = ipermute (y, [dperm, nd+1]);
ОБНОВЛЕНИЕ: Для исправления этой ошибки был отправлен патч. Он должен быть доступен как часть Octave 9.3.0. Если тем временем требуется исправление, односимвольное исправление, указанное выше, можно внести в файл movfun.m в версии 9.2.0 (набрав edit movfun
в Octave).
Итак, вот причина, по которой у вас возникла эта проблема: stackoverflow.com/q/78677682/7328782 — Это похоже на ошибку, вам следует открыть заявку в трекере ошибок Octave.