как сохранить циклические данные по одному в файл Excel в Matlab - PullRequest
0 голосов
/ 16 июля 2011

У меня огромный набор данных на листе Excel 1. Число столбцов фиксировано (6), но строк много.

Для каждых 3 строк мне нужно выбрать минимальное значение 2-го столбца и сохранить всю строку в файл Excel или лист 2, как я собираюсь написать скрипт?

item.xls (лист 1):

0.3 0.5 0.1 0.8 0.4 0.6
0.2 0.4 0.9 0.1 0.9 0.4
0.2 0.3 0.1 0.01 0.2 0.5
0.3 0.5 0.1 0.8 0.01 0.2
0.2 0.2 0.9 0.1 0.2 0.4
0.2 0.3 0.1 0.01 0.3 0.5
.......

В первых 3 строках минимальное значение 2-го столбца равно 0,3, затем запишите всю строку в лист 2 файла Excel.

Затем в следующих 3 строках минимальное значение 2-го столбца равно 0,2, затем запишите всю строку в лист 2 файла Excel.

Результат, который я хотел бы получить:

item.xls (sheet2):

0.2 0.3 0.1 0.01    % 1st 3 rows, the minimum value is 0.3 in 2nd column
0.2 0.2 0.9 0.1     % 2nd set of 3 rows, the minimum value is 0.2 in 2nd column
...

Ответы [ 2 ]

1 голос
/ 16 июля 2011

Я покажу, как извлечь соответствующие строки из данных в векторизованном виде.Я оставлю вам часть чтения / записи файлов Excel (это должно быть просто):

%# sample data
data = rand(3*10,6);

%# for each three rows, find the min of second column, and get the row index
[r c] = size(data);
d = permute(reshape(data',[c 3 r/3]),[2 1 3]);  %'# split into third dimension
[~,idx] = min(d(:,2,:));                        %# find min of col2
idx = squeeze(idx) + (0:3:(r-1))';              %'# adjust indices

%# extract these rows from the data matrix
result = data(idx,:);
1 голос
/ 16 июля 2011

Вниз, некоторые разъяснения по вашей проблеме помогут найти лучшее решение. Исходя из моей интерпретации вашего вопроса, следующий бит может помочь. Я генерирую случайные данные теста здесь.

% the number of test data rows
N = 12;

% generate some random vectors for testing
test1 = rand(N,1);
test2 = rand(N,1);
test3 = rand(N,1);
test4 = rand(N,1);

% create a temporary matrix to store the minimum of every
% 3 row set
final = zeros(N/3,4);

% loop in increments of 3
j = 1;
for k=1:3:N
    tmp = test2(k:k+2);

    % find the index of the minimum in this 3 row group of the 2nd col
    idx = find(tmp<=min(tmp));

    % offset idx to index into the original data properly
    idx = idx+k-1;

    % assign the "row" to the final variable
    final(j,:)=[test1(idx) test2(idx) test3(idx) test4(idx)];
    j = j+1;
end
% write the full results out at once
xlswrite('test.xls',final);

Попробуйте, и если это не совсем то, что вы ищете, оставьте комментарий, чтобы уточнить ваш вопрос.

...