Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环MATLAB的问题_Matlab_Loops - Fatal编程技术网

循环MATLAB的问题

循环MATLAB的问题,matlab,loops,Matlab,Loops,上面是我的txt文件的内容(千行) 我想创建一个新的文件,它将是每三个分数样本的总和除以同一样本的时间差 1st column - number of samples 2nd column - time (from beginning to end ->accumulated) 3rd column - scores 新的txt文件 e.g. (123+22+22)/ (12-10) = 167/2 = 83.5 (55+22+66)/(70-50) = 143/20 = 7.

上面是我的txt文件的内容(千行)

我想创建一个新的文件,它将是每三个分数样本的总和除以同一样本的时间差

1st column - number of samples
2nd column - time (from beginning to end ->accumulated)
3rd column - scores
新的txt文件

e.g. (123+22+22)/ (12-10) = 167/2 = 83.5
     (55+22+66)/(70-50) = 143/20 = 7.15
到目前为止,我有以下代码:

83.5
7.15
.
.
.
n

值得一提的是,下面是如何在Python中实现这一点。它可能适用于Matlab

fid=fopen('data.txt')
data = textscan(fid,'%*d %d %d')
time = (data{1})
score= (data{2})
for sample=1:length(score)
     ..... // I'm stucked here ..
end
....

值得一提的是,下面是如何在Python中实现这一点。它可能适用于Matlab

fid=fopen('data.txt')
data = textscan(fid,'%*d %d %d')
time = (data{1})
score= (data{2})
for sample=1:length(score)
     ..... // I'm stucked here ..
end
....

我建议您使用
importdata()
函数将数据放入名为
data
的变量中。大概是这样的:

%# Easier to load with importdata
data = importdata('data.txt',' ',1);
%# Get the number of rows
n = size(data,1);
%# Column IDs
time = 2;score = 3;
%# The interval size (3 in your example)
interval = 3;
%# Pre-allocate space
new_data = zeros(numel(interval:interval:n),1);
%# For each new element in the new data
index = 1;
%# This will ignore elements past the closest (floor) multiple of 3 as requested
for i = interval:interval:n
    %# First and last elements in a batch
    a = i-interval+1;
    b = i;
    %# Compute the new data
    new_data(index) = sum( data(a:b,score) )/(data(b,time)-data(a,time));
    %# Increment
    index = index+1;
end
用文件使用的分隔符替换
'
1
指定Matlab应忽略1个标题行。然后,要计算结果,请尝试以下语句:

data = importdata('data.txt',' ', 1)
这适用于您的示例数据,应该适用于您拥有的真实数据。如果你自己弄明白,你会学到一些有用的Matlab

然后使用
save()
将结果写回文件


PS如果您发现自己在Matlab中编写循环,可能是做错了。

我建议您使用
importdata()
函数将数据放入名为
data
的变量中。大概是这样的:

%# Easier to load with importdata
data = importdata('data.txt',' ',1);
%# Get the number of rows
n = size(data,1);
%# Column IDs
time = 2;score = 3;
%# The interval size (3 in your example)
interval = 3;
%# Pre-allocate space
new_data = zeros(numel(interval:interval:n),1);
%# For each new element in the new data
index = 1;
%# This will ignore elements past the closest (floor) multiple of 3 as requested
for i = interval:interval:n
    %# First and last elements in a batch
    a = i-interval+1;
    b = i;
    %# Compute the new data
    new_data(index) = sum( data(a:b,score) )/(data(b,time)-data(a,time));
    %# Increment
    index = index+1;
end
用文件使用的分隔符替换
'
1
指定Matlab应忽略1个标题行。然后,要计算结果,请尝试以下语句:

data = importdata('data.txt',' ', 1)
这适用于您的示例数据,应该适用于您拥有的真实数据。如果你自己弄明白,你会学到一些有用的Matlab

然后使用
save()
将结果写回文件


PS如果你发现自己在Matlab中编写循环,你可能是做错了什么。

如果你喜欢冒险,这里有一个使用ACCUMARRAY的矢量化单行解决方案(假设你已经像其他人一样读取了矩阵变量
data
中的文件):

注意,这里的样本数
NUM=3
是一个参数,可以用任何其他值代替

另外,请阅读您的上述评论,如果样本数量不是此数量的倍数(
3
),则只需事先执行此操作即可丢弃剩余样本:

NUM = 3;
result = accumarray(reshape(repmat(1:size(data,1)/NUM,NUM,1),[],1),data(:,3)) ...
    ./ (data(NUM:NUM:end,2)-data(1:NUM:end,2))

对不起,这里有一个更简单的:p

data = data(1:fix(size(data,1)/NUM)*NUM,:);

如果您喜欢冒险,这里有一个使用ACCUMARRAY的矢量化单行解决方案(假设您已经像其他人一样读取矩阵变量
data
中的文件):

注意,这里的样本数
NUM=3
是一个参数,可以用任何其他值代替

另外,请阅读您的上述评论,如果样本数量不是此数量的倍数(
3
),则只需事先执行此操作即可丢弃剩余样本:

NUM = 3;
result = accumarray(reshape(repmat(1:size(data,1)/NUM,NUM,1),[],1),data(:,3)) ...
    ./ (data(NUM:NUM:end,2)-data(1:NUM:end,2))

对不起,这里有一个更简单的:p

data = data(1:fix(size(data,1)/NUM)*NUM,:);

你能保证
n
是3的倍数吗?否。如果剩余的小于3,例如1或2个样本,它将离开它。你能保证
n
是3的倍数吗?否。如果剩余的小于3,例如1或2个样本,它将离开它。@Mark:循环并不总是坏的。这在SO中已经讨论过。此外,此解决方案将时间间隔固定为3,(
数据(1:3:end,3)+数据(2:3:end)+……
)。@Jessy--您的数据集有多大?数千行--318687lines@Mark:循环并不总是坏的。这在SO中已经讨论过。另外,此解决方案将时间间隔固定为3,(
data(1:3:end,3)+data(2:3:end)+……
)。@Jessy--您的数据集有多大?数千行--318687行+1:我以前从未遇到过Accumaray,比我的解决方案简洁得多。谢谢@Amro.+1:我以前从未见过Accumaray,它比我的解决方案更简洁。谢谢@Amro。我想知道importdata和textscan有什么不同?在
textscan
中,您需要指定格式,
importdata
会计算出来(大部分时间)。我想知道文件中的“数据”是否为。data..参考文件名?data.txt?我在实现代码时遇到此错误。.尝试引用非结构数组。:(否,
data
importdata
之后的数据组件。您可以键入
file=importdata('data.txt');disp(file)吗
并告诉我它的输出是什么?我想知道importdata和textscan之间有什么不同?在
textscan
中,您需要指定格式,
importdata
计算出来(大部分时间)。我想知道“数据”是否在file.data中..引用文件名?data.txt?我在实现代码时遇到这个错误..尝试引用非结构数组..:(不,
data
importdata
之后的数据组件。你能键入
file=importdata('data.txt');disp(file)
并告诉我它的输出是什么吗?