0

データをプロットする方法が効率的な方法であるかどうかを知りたいです。これは事実ですか?または、Structs を作成してから、for ループの外側で一度にプロットを作成する別の方法が存在しますか?

私がやること:

ラットごとに 1 日あたり複数のプロット。そして、ゼロで満たされていない配列をチェックしますが、それらの配列は興味深いものではありません。次のように構築する、ネストされた構造体に値を格納しています。

for Rat = vecRat(1):vecRat(end)   
    for Day = UserDayArray 
        % I Build an array with Timediff here, which I left out for clarity
        Subject(Rat).day(Day). Timediff = Timediff;
        if isempty(Subject(Rat).day(Day).CumTimediff) == 0 && max((Subject(Rat).day(Day).CumTimediff)) ~= 0 && min((Subject(Rat).day(Day).CumTimediff)) ~=0
           stem(Subject(Rat).day(Day). Timediff)   %plots data
           end

        %Tells User that for this day no shaped trials were found.
        elseif isempty(Subject(Rat).day(Day).CumTimediff) == 0              
        fprintf(['****************** TSBP ', num2str(Rat), ' Day ', num2str(Day),'******************\n']);
        fprintf('No Shaping algorythm present/No Timechange detected\n');
        fprintf('No plots made\n');
        end
    end
end
4

1 に答える 1

1

「cellfun」、論理インデックス、および構造体の逆参照を組み合わせて、これが私が思いついたものです。正確なデータ構造はわかりませんが、これでうまくいくはずです。

alldays=Subject(vecRat(1):vecRat(end)).day
AllCumTimediff={alldays(UserDayArray).CumTimediff}
%Use nested cellfun using the all and eq functions to check which plots can be made
%all([])=true so check for isempty to
plotsNotToUse=cellfun(@all,cellfun(@eq,AllCumTimediff,repmat({0},1,numel(AllCumTimediff)),'UniformOutput',false))
%Call your plotter and message functions
cellfun(@myplotter,AllCumTimediff(~plotsNotToUse))
cellfun(@myemptyMessage,AllCumTimediff(plotsNotToUse))


%%
function myplotter(CumTimediff)
figure; % create new figure
plot(CumTimediff);
%Whatever other commands
于 2013-03-06T20:37:27.787 に答える