【问题标题】:Loops on a Matlab programMatlab程序上的循环
【发布时间】:2010-04-09 17:49:05
【问题描述】:

我有 3 组,每组 10 个向量,我想从第一组中获取 2 个向量,从第二组中获取 2 个向量,从第三组中获取 3 个向量。我的目标是做一个循环来执行下面的程序,知道每次计算后,结果都要保存在一个新文件中。
我的问题是我无法处理字符串中包含的索引。我尝试使用多个循环按索引顺序扫描 3 个集合。循环应该包含以下程序

clc;  
clear all;  

load('C:\Users\Documents\MATLAB\myFile\matrice_F.mat');  
load('C:\Users\Documents\MATLAB\myFile\matrice_G.mat');  

F = m_F;  
G = m_G;  


load('C:\Users\Documents\MATLAB\myFile\matrice_J.mat');  
load('C:\Users\Documents\MATLAB\myFile\matrice_K.mat');  

J = m_J;  
K = m_K;  

load('C:\Users\Documents\MATLAB\myFile\matrice_N.mat');  
load('C:\Users\Documents\MATLAB\myFile\matrice_O.mat');  
load('C:\Users\Documents\MATLAB\myFile\matrice_P.mat');    
N = m_N ;  
O = m_O;  
P = m_P;  

[A,B,C,D,E] = myFun(F,G,J,K,N,O,P);  

file_name = 'matrice_final.mat';  
save(file_name,'A','B','C','D','E');   

感谢所有回答我问题的人。抱歉,如果我从一开始就没有那么准确。但是,我希望程序看起来像:

clc; 


    clear all;    

    set1={F,G,FF,GG,X,Y,XX,L,BH,JK};  %set of name vectors  
    set2={J,K,HG,UY,TR,BC,XW,IOP,ES,QA};  %set of name vectors  
    set3={AJ,RK,DS,TU,WS,ZZE,ZXW,TYP,ZAA,QWW};  %set of name vectors  

for i=1:1:9    

        load('C:\Users\Documents\MATLAB\myFile\matrice_'set1(i)'.mat');    
        load('C:\Users\Documents\MATLAB\myFile\matrice_'set1(i+1)'.mat');   

        'set1(i)' = m_'set1(i)';     
        'set1(i+1)' = m_'set1(i+1)';     

    for j=1:1:9   

        load('C:\Users\Documents\MATLAB\myFile\matrice_'set2(j)'.mat');     
        load('C:\Users\Documents\MATLAB\myFile\matrice_'set2(j+1)'.mat');  

        'set2(j)' = m_'set2(j)';     
        'set2(j+1)' = m_'set2(j+1)';   

        for k=1:1:8   

            load('C:\Users\Documents\MATLAB\myFile\matrice_'set3(k)'.mat');       
            load('C:\Users\Documents\MATLAB\myFile\matrice_'set3(k+1)'.mat');      
            load('C:\Users\Documents\MATLAB\myFile\matrice_'set3(k+2)'.mat');        

            'set3(k)' = m_'set3(k)' ;      
            'set3(k+1)' = m_'set3(k+1)';     
            'set3(k+2)' = m_'set3(k+2)';      

    [Result1'index',Result2'index',Result3'index',Result4'index',Result5'index'] = myFun('set1(i)','set1(i+1)','set2(j)','set2(j+1)','set3(k)','set3(k+1)','set3(k+2)');  %% 9x9x8=648   index=1,2,...,648      

    file_name = 'matrice_final'index'.mat';      
    save(file_name,'Result1'index'','Result2'index'','Result3'index'','Result4'index'','Result5'index'');        
        clear 'set3(k)' 'set3(k+1)' 'set3(k+2)'   
        end   
    clear 'set2(j)' 'set2(j+1)'   
    end   
    clear 'set1(i)' 'set1(i+1)'
end

【问题讨论】:

  • 您的问题是什么?你似乎只是想让我们给你代码
  • 循环只是为了更改向量的名称。我只想知道如何包含索引。例如,for load('C:\Users\Documents\MATLAB\myFile\matrice_F.mat');如何使用循环通过 matrice_H 更改 matrice_F?
  • 还是不明白你的问题。 '改变矩阵_F'是什么意思?
  • 我有三组向量名称,我想在我的程序中循环这 3 组来更改向量 F、G、J、K、N、O、P。我怎么能去做?我无法处理字符串中包含的索引。
  • 如果 set1={F,G,X,Y,Z,FF,GG,XX,YY,RR},我想用 matrice_X 和 matrice_Y 替换 matrice_F matrice_G 等等......其他两组也一样

标签: matlab


【解决方案1】:

注意:已更新以满足问题中的新要求...

这是一个避免使用EVAL的解决方案:

clc;
clear all;

set1 = {'F','G','FF','GG','X','Y','XX','L','BH','JK'};
set2 = {'J','K','HG','UY','TR','BC','XW','IOP','ES','QA'};
set3 = {'AJ','RK','DS','TU','WS','ZZE','ZXW','TYP','ZAA','QWW'};

matrices = cell(1,7);  %# An empty cell array
fileString = 'C:\Users\Documents\MATLAB\myFile\matrice_';  %# First part of
                                                           %#   file name

for i = 1:9  %# Loop over set1

  fileData = load([fileString set1{i} '.mat']);  %# Load file
  matrices{1} = fileData.(['m_' set1{i}]);       %# Get matrix

  fileData = load([fileString set1{i+1)} '.mat']);  %# Load file
  matrices{2} = fileData.(['m_' set1{i+1}]);        %# Get matrix

  for j = 1:9  %# Loop over set2

    fileData = load([fileString set2{j} '.mat']);  %# Load file
    matrices{3} = fileData.(['m_' set2{j}]);       %# Get matrix

    fileData = load([fileString set2{j+1)} '.mat']);  %# Load file
    matrices{4} = fileData.(['m_' set2{j+1}]);        %# Get matrix

    for k = 1:8  %# Loop over set3

      fileData = load([fileString set3{k} '.mat']);  %# Load file
      matrices{5} = fileData.(['m_' set3{k}]);       %# Get matrix

      fileData = load([fileString set3{k+1} '.mat']);  %# Load file
      matrices{6} = fileData.(['m_' set3{k+1}]);       %# Get matrix

      fileData = load([fileString set3{k+2} '.mat']);  %# Load file
      matrices{7} = fileData.(['m_' set3{k+2}]);       %# Get matrix

      [A,B,C,D,E] = myFun(matrices{:});  %# Pass matrices to your function

      index = k+8*(j-1)+72*(i-1);        %# Combination index
      fileName = ['matrice_final' int2str(index) '.mat'];  %# Save file name
      save(fileName,'A','B','C','D','E');                  %# Save the data

    end
  end
end

我做了一个小的修改。我没有将A1E1 保存在文件matrice_final1.mat 中,将A2E2 保存在文件matrice_final2.mat 等中,而是将AE 保存在每个文件中,因为文件name 本身已经指示索引。如果您想一次加载多个文件而不使矩阵AE 相互覆盖,您可以执行以下操作:

data1 = load('matrice_final1.mat');  %# Load data into structure data1
data2 = load('matrice_final2.mat');  %# Load data into structure data2

现在,data1.A 将为您提供索引 1 的 Adata2.A 将为您提供索引 2 的 A

【讨论】:

  • @Jacob:有时我认为 EVAL 是必要的,但我从来没有真正喜欢过它。使用它的代码看起来从来没有那么干净或易于阅读,当您在要评估的表达式中处理字符串时,不得不转义 ' 很烦人。通常,使用 EVAL 有更好的选择,例如对结构使用动态字段名称 (mathworks.com/access/helpdesk/help/techdoc/matlab_prog/…) 或元胞数组和逗号分隔列表 (mathworks.com/access/helpdesk/help/techdoc/matlab_prog/…)。
  • 没错,我之前也从未使用过eval - 不要做太多需要它的工作。
  • @Jacob, @Pyrolistical :我感谢所有回答我问题的人。抱歉,如果我从一开始就没有那么准确。但是,我希望程序看起来像上面提供的那样。
【解决方案2】:

好的,我想我现在明白了。您在引用从 mat 文件加载的矩阵时遇到问题。你从.mat文件中知道矩阵的名字,但是在matlab中怎么引用呢?

你需要使用eval

您需要执行以下操作:

  1. 读取文件名中的字母并将其存储在变量letter
  2. 加载矩阵
  3. 致电loaded_array = eval(['m_', letter]);

【讨论】:

    【解决方案3】:

    更新:

    好的,你的程序看起来不错,但是你有一些基本的错误:

    字符串连接:

    load('C:\Users\Documents\MATLAB\myFile\matrice_'set1(i)'.mat');
    

    因此,您传递给load 的字符串并不是真正的字符串,除非您将其连接起来。例如, ['Hello' ' ' 'World'] 将是字符串 Hello World。您需要将其包含在[] 中。

    因此将load 语句更改为:

    load(['C:\Users\Documents\MATLAB\myFile\matrice_' set1(i) '.mat']);
    

    错误使用eval

    要使eval 工作,您需要构造字符串(即命令)并将其传递给eval。以下将不起作用:

    'set1(i)' = m_'set1(i)';
    

    但这会起作用:

    eval([ set1(i) ' = m_' set1(i) ';']);
    

    因为它相当于 (if i = 1);

    A = m_A;
    

    使用index

    我不明白index 变量的作用。

    clear

    clear 可以与字符串参数一起使用,所以:

    clear 'set2(j)' 'set2(j+1)' 
    

    应改为:

    clear(set2(j),set2(j+1));
    

    旧答案: 你需要eval。我认为不建议这样做,但它似乎适合你。

    %%// Cleanup
    clc;  
    clear all;  
    
    %%// The loop
    matrices = 'FGJKNOP';
    for i = 1:numel(matrices)
        load_string = ['load(''C:\Users\Documents\MATLAB\myFile\matrice_' matrices(i) '.mat'');'];
        eval(load_string); %// Example: load('C:\Users\Documents\MATLAB\myFile\matrice_F.mat'); 
        eval([matrices(i) ' = m_' matrices(i) ';']); %// Example: F = m_F;  
    
    end
    
    %%// Saving the data
    results = 'ABCDE';
    %// Make the string [A,B,C,D,E]
    results_string = sprintf('%c,',results);
    results_string = ['[' results_string(1:end-1) ']'];
    %// Make the string (F,G,J,K,N,O,P)
    matrices_args = sprintf('%c,',matrices);
    matrices_args = ['(' matrices_args(1:end-1) ');'];    
    %// Make the string ,'A','B','C','D','E' etc.
    results_args = sprintf(',''%c''',results);
    
    %// Save the data
    eval([results_string ' = myFun' matrices_args]);
    file_name = 'matrice_final.mat';
    eval(['save(file_name' results_args ');']);
    

    【讨论】:

      猜你喜欢
      • 2019-04-21
      • 2017-11-12
      • 2020-03-24
      • 1970-01-01
      • 2014-12-28
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多