Matlab 用矩阵上符号变化位置的索引构造一个表

Matlab 用矩阵上符号变化位置的索引构造一个表,matlab,Matlab,我有一个矩阵M,包含从电池充电和放电中收集的大量数据。 为了知道每次充电和放电的开始和结束指数,并计算其他一些参数(容量和能量),我编写了以下代码 如果我的数据量很小,它工作得很好,否则它会花费很长时间。 我想知道是否有其他方法可以做到这一点 谢谢你的帮助 M = load(ChargeDischargeData); Cap=[]; % capacity charged or discharged Tab=[];% [state |StartTime | StartIndex

我有一个矩阵
M
,包含从电池充电和放电中收集的大量数据。 为了知道每次充电和放电的开始和结束指数,并计算其他一些参数(容量和能量),我编写了以下代码

如果我的数据量很小,它工作得很好,否则它会花费很长时间。 我想知道是否有其他方法可以做到这一点

谢谢你的帮助

M = load(ChargeDischargeData);       

Cap=[]; % capacity charged or discharged
Tab=[];% [state |StartTime | StartIndex  | EndTime | EndIndex | Capacity | Energy]

State=sign(M(1,4)); % State==-1 is a charge and State==1 is discharge
i_srt=1;capacity=0;energy=0;
filt=200;% minimun point need to consider as a valid charge or discharge


for j=2:size(M,1)
    if (sign(M(j,4))~=State)
        if j<filt
            State=sign(M(1,4));i_srt=j;
        elseif j+filt>size(M,1)
            Tab=[Tab;State M(i_srt,1) i_srt M(j-1,1) j-1 capacity energy];
            State=sign(M(j,4));i_srt=j;capacity=0;energy=0;
        elseif (sign(M(j+filt,4))==sign(M(j,4)))
            Tab=[Tab;State M(i_srt,1) i_srt M(j-1,1) j-1 capacity energy];
            State=sign(M(j,4));i_srt=j;capacity=0;energy=0;
        end
    else
        capacity=capacity+abs(M(j,4))*(M(j,1)-M(j-1,1));
        if State==1 %Discharging
            energy=energy+abs(M(j,2)*M(j,4)*(M(j,1)-M(j-1,1)));  %energy during discharge
        elseif State==-1 %Charging
            energy=energy+abs((M(j,3)-M(j,2))*M(j,4)*(M(j,1)-M(j-1,1)));   %energy during charge
        end
    end
    Cap=[Cap;capacity];  %create a matrix with the evolution of the capacity
end
M=负载(充放电数据);
上限=[];%充放电容量
选项卡=[];%[状态|开始时间|开始索引|结束时间|结束索引|容量|能量]
状态=符号(M(1,4));%状态==-1为充电状态,状态==1为放电状态
i_srt=1;容量=0;能量=0;
过滤器=200;%最小点需要考虑作为有效的电荷或放电。
对于j=2:尺寸(M,1)
if(符号(M(j,4))~=状态)
如果jsize(M,1)
Tab=[Tab;状态M(i_srt,1)i_srt M(j-1,1)j-1容量能量];
状态=符号(M(j,4));i_srt=j;容量=0;能量=0;
elseif(符号(M(j+filt,4))==符号(M(j,4)))
Tab=[Tab;状态M(i_srt,1)i_srt M(j-1,1)j-1容量能量];
状态=符号(M(j,4));i_srt=j;容量=0;能量=0;
结束
其他的
容量=容量+abs(M(j,4))*(M(j,1)-M(j-1,1));
如果状态==1%放电
能量=能量+abs(M(j,2)*M(j,4)*(M(j,1)-M(j-1,1));%放电过程中的能量
elseif状态==-1%充电
能量=能量+abs((M(j,3)-M(j,2))*M(j,4)*(M(j,1)-M(j-1,1));%充电时的能量
结束
结束
上限=[上限;容量];%根据能力的演变创建矩阵
结束

请不要发送垃圾标签;是4个问题中唯一一个与你的问题相关的。发布一个小例子,包括输入和期望的输出。很难猜出你想要从代码中得到什么谢谢你路易斯·门多,我编辑了我的问题。我猜在每次迭代中调整Cap和Tab变量的大小会消耗一些时间。在使用for循环和索引到矩阵中之前,考虑使用<代码>零/代码>预分配空间,以输入计算值。Matlab强烈建议当您知道数组的大小时,初始化它。这确保了为数据分配内存,并减少了移动和分配新内存所带来的大量开销。尝试类似的方法:Cap=zero(M-1,1),通过索引分配值,而不是串联。这是提高性能的第一件事。(正如@Cecilia所说)请不要垃圾标签;是4个问题中唯一一个与你的问题相关的。发布一个小例子,包括输入和期望的输出。很难猜出你想要从代码中得到什么谢谢你路易斯·门多,我编辑了我的问题。我猜在每次迭代中调整Cap和Tab变量的大小会消耗一些时间。在使用for循环和索引到矩阵中之前,考虑使用<代码>零/代码>预分配空间,以输入计算值。Matlab强烈建议当您知道数组的大小时,初始化它。这确保了为数据分配内存,并减少了移动和分配新内存所带来的大量开销。尝试类似的方法:Cap=zero(M-1,1),通过索引分配值,而不是串联。这是提高性能的第一件事。(正如@Cecilia所说。)