2014-02-14 3 views
0

У меня есть текстовый файл, содержащий 14000 строк и 7 столбцов. Я должен взять каждую из этих столбцов. Затем мне нужно найти сумму 1-го 40 элементов, затем следующие 40 элементов (41-80), затем следующие 40 (81-120) и так далее. Для этого я написал код MATLAB. Это:Суммирование нескольких элементов в текстовом файле в MATLAB

clc;clear all;close all; 
fid = fopen('sks.txt'); 
datacell = textscan(fid,'%f%f%f%*[^\n]',... 
'delimiter','\t'); 
fclose(fid); 
A = datacell{1}; 
B=datacell{2}; 
l=size(A); 
k=40; 
sum=0; 
for x=1:k 
    sum=sum+A(x); 
end; 
sum 
for y=1:((l/k)-1) 
sum1=0; 
    for i=((y*k)+1):((y+1)*k) 
     sum1=sum1+A(i); 
    end; 
end; 

Я получаю все наборы сумм correcly с этим кодом, но я хочу, чтобы все ответы, как одну матрицу. В настоящее время все ответы получены отдельно. Есть 350 отдельных ответов. Я хочу, чтобы все 350 в одной матрице. Я хочу что-то вроде

Sum=23 
    34 
    87 
....... 

и так далее.

Не

sum=23 
sum=34 
sum=87 

Я не очень хорошо кодирования или MATLAB. Поэтому, если есть более простой способ, кроме этого, вы можете больше приветствовать меня. Или, пожалуйста, помогите мне изменить этот код :-)

ответ

0

Вы можете присвоить эти значения таким образом (матрица будет расширяться с каждой итерации.):

sum = [] % init output matrix 
for y=1:((l/k)-1) 
sum1=0; 
    for i=((y*k)+1):((y+1)*k) 
     sum1=sum1+A(i); 
    end; 
    sum = [sum; sum1] % it will automatically expend matrix 
end; 

или как Вы знаете, окончательный вывод Сумма матрица (длина (1: ((л/к) -1)))

sum = zeros(1,length(1:((l/k)-1))) % init output matrix 
ii = 1; % matrix index 
for y=1:((l/k)-1) 
sum1=0; 
    for i=((y*k)+1):((y+1)*k) 
     sum1=sum1+A(i); 
    end; 
    sum(ii) = sum1 % assign value to matrix 
    ii = ii + 1;  % increment matrix index 
end; 
0

Не весь ответ - но сделает код намного чище и быстрее:

Вы мили ght сталкиваются с некоторыми проблемами, поскольку sum на самом деле является именем встроенной функции, которая случайно делает именно то, что вы делаете в циклах (только быстрее).

Используйте такие вещи, как:

mySum = sum(A) 

и

mySum1 = mySum1 + sum(((y*k)+1):((y+1)*k)) 
0

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

A = datacell{1}; 
A1=squeeze(sum(reshape(A, 40, [], 1))); 

A1 даст сумму каждого набора из 40 элементов.

Смежные вопросы