【问题标题】:Matlab coder "Error indenting generated C code"Matlab 编码器“缩进生成的 C 代码时出错”
【发布时间】:2014-03-27 14:54:24
【问题描述】:

我正在尝试使用 MATLAB 编码器将 MATLAB 代码转换为 C++,但出现此错误:

缩进生成的 C 代码时出错

错误指向函数本身的名称,其中没有更多解释。有人可以告诉我这是什么错误吗? 这是我要转换的功能:

function [Report_Clustered,ClusterCounter_new]=InitClusterGenerator_test(Report_In,~,FreqEpsilon,DegreeEpsilon,~,ClusterCounter_old, BlockCount, Report_old)

Report_M = zeros(size(Report_In,1),size(Report_In,2),4);
for i=1:size(Report_In,1)
    for j=1:size(Report_In,2)
        Report_M(i,j,1)=Report_In(i,j,1);
        Report_M(i,j,2)=Report_In(i,j,2);
        Report_M(i,j,3)=0; % Cluster number that the point belongs to.
        Report_M(i,j,4)=0;
Report_In{i,j} 
    end
end
ClusterCounter = 0;
for i=1:size(Report_M,1)
    for j=1:size(Report_M,2)
        if (Report_M(i,j,3) == 0)
            ClusterCounter = ClusterCounter + 1;
            Report_M(i,j,3) = ClusterCounter;
            for ii=1:size(Report_M,1)
                for jj=1:size(Report_M,2)
                    if (Report_M(ii,jj,3) == 0)
                        if (abs(Report_M(i,j,1)-Report_M(ii,jj,1))<FreqEpsilon &&...
                        (abs(Report_M(i,j,2)-Report_M(ii,jj,2)) <DegreeEpsilon ||...
                        abs(-360 + Report_M(i,j,2)-Report_M(ii,jj,2)) <DegreeEpsilon ||...
                        abs(360 + Report_M(i,j,2)-Report_M(ii,jj,2)) <DegreeEpsilon))
                            Report_M(ii,jj,3) = ClusterCounter;
                        end
                    end
                end
            end
        end
    end
end    


if (BlockCount> 20 && ClusterCounter<4)
    warning = 1;
end



        ClusterCounter_new = ClusterCounter;

        %clear Report_new;
        flag = 0;

        Report_new = zeros(ClusterCounter,size (Report_M, 2),4);

        index = zeros(1, ClusterCounter_new);
        for i = 1: size (Report_M, 1)
            for j = 1: size (Report_M, 2)
                for k = 1: ClusterCounter_new
                    if (Report_M(i,j,3) == k)
                        index(1,k) = index(1,k) + 1;
                        Report_new(k,index(1,k), 1:3) = Report_M(i,j,1:3);
                        flag = flag + 1;
                    end
                end

            end
        end



        for j = 1: size (Report_new, 2)
            for i = 1: size (Report_new, 1)
                if (Report_new(i,j,1) == 0)
                    Report_new(i,j,1:3) = Report_new(i,1,1:3);
                end
            end
        end

        %Report_new = Report;


        MedoidF_old = zeros(1, size(Report_old,1));
        MedoidA_old = zeros(1, size(Report_old,1));


        for i=1:size(Report_old,1)
            SumF = 0;
            SumA = 0;
            MinAngle = 361;
            MaxAngle = -1;
            for j=1:size(Report_old,2)
                SumF = SumF + Report_old(i,j,1);
                SumA = SumA + Report_old(i,j,2);
                if Report_old(i,j,2) > MaxAngle
                    MaxAngle = Report_old(i,j,2);
                elseif Report_old(i,j,2) < MinAngle
                    MinAngle = Report_old(i,j,2);
                end
            end
            MedoidF_old(1, i) = SumF/size(Report_old,2);
            if (MaxAngle - MinAngle) > 350
                MedoidA_old(1, i) = 0;
            else
                MedoidA_old(1, i) = SumA/size(Report_old,2);
            end
        end


        MedoidF_new = zeros(1, size(Report_new,1));
        MedoidA_new = zeros(1, size(Report_new,1));


        for i=1:size(Report_new,1)
            SumF = 0;
            SumA = 0;
            MinAngle = 361;
            MaxAngle = -1;
            for j=1:size(Report_new,2)
                SumF = SumF + Report_new(i,j,1);
                SumA = SumA + Report_new(i,j,2);
                if Report_new(i,j,2) > MaxAngle
                    MaxAngle = Report_new(i,j,2);
                elseif Report_new(i,j,2) < MinAngle
                    MinAngle = Report_new(i,j,2);
                end
            end
            MedoidF_new(1, i) = SumF/size(Report_new,2);
            if (MaxAngle - MinAngle) > 350
                MedoidA_new(1, i) = 0;
            else
                MedoidA_new(1, i) = SumA/size(Report_new,2);
            end
        end

        TempCluster = zeros(1, size(Report_new, 1));
        CurrentCluster = ClusterCounter_old;        


        for i = 1: 1: size(Report_new,1)
            for j = 1: 1: size(Report_old,1)
                if (abs(MedoidF_old(1,j)-MedoidF_new(1,i))<FreqEpsilon &&...
                        (abs(MedoidA_old(1,j)-MedoidA_new(1,i))<DegreeEpsilon ||...
                        abs(360 + MedoidA_old(1,j)-MedoidA_new(1,i))<DegreeEpsilon ||...
                         abs(-360 + MedoidA_old(1,j)-MedoidA_new(1,i))<DegreeEpsilon))      %%if the new cluster is the rest of an old cluster use the old one's index for it
                    TempCluster(1,i) = Report_old(j,1,3);
                end
            end

            %%this part is for seperating the clusters which where in the collision state in the past time



            if (TempCluster(1,i)>0) %%if the new cluster is one of the old ones the index should be set
                for j = 1:1:size(Report_new, 2)
                    Report_new(i,j,3) = TempCluster(1,i);
                    Report_new(i,j,4) = 1;% Alive
                end
            else    %%first search if the new cluster is a part of a newly found cluster found before this one
                for j = 1: 1: i-1
                    if (abs(MedoidF_new(1,j)-MedoidF_new(1,i))<FreqEpsilon &&...
                            (abs(MedoidA_new(1,j)-MedoidA_new(1,i))<DegreeEpsilon ||... 
                            abs(360 + MedoidA_new(1,j)-MedoidA_new(1,i))<DegreeEpsilon ||...
                            abs(-360 + MedoidA_new(1,j)-MedoidA_new(1,i))<DegreeEpsilon))       %%if the new cluster is the rest of an old cluster use the old one's index for it
                        TempCluster(1,i) = Report_new(j,1,3);
                    end
                end
            end

            if (TempCluster(1,i)>0) %%if the new cluster is one of the old ones the index should be set
                for j = 1:1:size(Report_new, 2)
                    Report_new(i,j,3) = TempCluster(1,i);
                    Report_new(i,j,4) = 1;% Alive
                end
            else    %%new cluster is just began so it needs a new index
                CurrentCluster = CurrentCluster + 1;
                ClusterCounter_new = CurrentCluster;
                TempCluster(1,i) = CurrentCluster;
                for j = 1:1:size(Report_new, 2)
                    Report_new(i,j,3) = TempCluster(1,i);
                    Report_new(i,j,4) = 1; % Alive
                end
            end

        end


        NewClusters = zeros(1, size (Report_new, 1));
        for i = 1: size(Report_new, 1)
            NewClusters (1,i) = Report_new(i,1,3);
        end

        OldClusters = zeros(1, size (Report_old, 1));
        OldClustersLine = zeros(1, size (Report_old, 1));
        for i = 1: size(Report_old, 1)
            OldClusters (1,i) = Report_old(i,1,3);
            OldClustersLine (1, i) = i;
        end


        NumberOfDead = 0;
        %clear AddDead;
        AddDead = zeros (16,size(Report_new, 2),4);
        if (BlockCount>10)
        for i = 1: size (OldClusters, 2)
            IsDead = 1;
            for j = 1: size (NewClusters, 2)
                if OldClusters(1, i) == NewClusters(1,j)
                    IsDead = 0;
                end
            end
            if (IsDead == 1)
                NumberOfDead = NumberOfDead + 1;
                %clear TempLine;
                TempLine = zeros(1, size(Report_old,2), 4);
                TempLine(1,:,1:3) = Report_old(OldClustersLine(1, i),:,1:3);
                for k= 1: size(TempLine, 2)
                    TempLine(1,k,4) = 0;    % Dead
                end
                TempSize = size(TempLine, 2);
                Thresh = size(Report_new, 2);

                if (TempSize >= Thresh)
                    AddDead (NumberOfDead, 1:Thresh, 1:4) = TempLine(1,1:Thresh, 1:4);
                else
                    for l = 1: Thresh-TempSize
                        TempLine(1, TempSize+l, 1:4) = TempLine(1, TempSize, 1:4);
                    end
                    AddDead (NumberOfDead, 1:Thresh, 1:4) = TempLine(1,1:Thresh, 1:4);
                end
            end
        end
        xR = size (Report_new,1);
        if (NumberOfDead == 0)
            Report_Clustered = zeros (size(Report_new,1),size(Report_new,2),size(Report_new,3));
        else
            Report_Clustered = zeros (size(Report_new,1) + NumberOfDead,size(Report_new,2),size(Report_new,3));
        end
        Report_Clustered (1:size(Report_new,1), :, :) = Report_new(:,:,:);
        for i = 1: NumberOfDead
            Report_Clustered(xR + i, :) = AddDead(i, :);
        end


end

我正在使用 matlab 2012a Tnx。

【问题讨论】:

  • 您能用一个小的复制代码粘贴确切的错误消息吗?另外,你用的是哪个版本的matlab?
  • 问题已解决。这个错误一定是由于 matlab 无法覆盖在 mex 制作过程中构建的文件。您应该退出 matlab,删除 coder 制作的文件并尝试再次运行 coder。 @LokeshA.R.无论如何。
  • 也许您也可以添加解决方案。它将帮助其他有相同错误消息的人。
  • 解决方案很简单,问题是当您使用 coder 从您的 matlab 代码构建 .mex 文件并运行它时,当您想在 matlab 代码中进行更改并再次构建它时,您可以面对这个错误。我认为这种情况只有在您的 .mex 代码因错误而停止工作时才会发生。我认为 MATLAB 不会以某种方式关闭它正在运行的 .mex 文件,因此您无法重建它。在这种情况下,如果您尝试从工作区中删除 .mex 文件,您会注意到它说权限被拒绝,因此您只需关闭 matlab 并删除 .mex 文件并再次运行 matlab。希望对您有所帮助。
  • @Brokenlink,非常感谢,我从来不会这么想

标签: matlab matlab-coder


【解决方案1】:

从您在 cmets 中所说的来看,您似乎只需要调用

clear functions

在重新编译函数之前从命令行中允许 Matlab 覆盖文件。有关详细信息,请参阅this Matlab 论坛或clear 的文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-17
    • 2010-09-18
    • 2017-07-06
    • 2017-05-11
    • 2020-01-28
    • 2015-05-14
    • 2011-12-07
    • 1970-01-01
    相关资源
    最近更新 更多