【问题标题】:Undefined function or method 'shuffle' for input arguments of type 'cell''cell' 类型的输入参数的未定义函数或方法 'shuffle'
【发布时间】:2012-11-30 05:03:55
【问题描述】:

我正在尝试创建一个具有 shuffle 和 deal 方法的类“Deck”,但是,我不知道为什么我的“shuffle”函数没有运行。我收到错误消息:

“cell”类型的输入参数的未定义函数或方法“shuffle”。

有人可以解释为什么该功能没有运行吗?非常感谢你。 我正在调用以前创建的 classdef 'Card'

 classdef Deck < handle;
 properties;
     diamond;
     spade
     heart;
     club;


    end;
     methods;
       function obj=create(deck);
         for k=1:13;
             %Designate a number to each suit to create the deck
             obj(k).diamond=cards('D','R',k);
             obj(k).spade=cards('S','B',k);
             obj(k).heart=cards('H','R',k);
            obj(k).club=cards('C','B',k);
         end
         %Create a vector of each suit and number accordingly until we
         %have 52 cards. 13 of each suit.
         obj={obj.diamond obj.spade obj.heart obj.club};            

     end

     %%
     function obj=shuffle(obj);

             shuff=randperm(52);

         for k=1:52;  
             hf=shuff(k);
             obj(k)=obj(hf);


         end
         end

     end
   end

【问题讨论】:

  • 啊哈哦,我想我忘记了。谢谢。
  • 这一行是做什么的:obj{k}=obj(hf);如果此代码是 matlab 代码,我认为大括号不会出现在“=”符号的左侧。它们仅用于在左侧分配值。还有什么是 shuffle 函数:hf=shuff(k);?
  • 我做了 obj(k)=obj(hf) 来打乱它的索引顺序,从而洗牌。是的,我不知道花括号。我想使用它们,因为甲板是一个单元格,但主要是那条线是洗牌的顺序。

标签: oop matlab


【解决方案1】:

你不需要构造函数中的最后一行:

obj = { obj.diamond obj.spade obj.heart obj.club }

这一行将您的对象变成了一个单元格 (?)。尝试删除此行。 试试这个classdef

classdef Deck 
     properties 
          cards
     end
 methods
     function obj = Deck()
          % do your stuff here, but no obj. before diamond/spade/heart/club
          obj.cards = { diamond, spade, heart, club };
     end 
     function obj  =shuffle ( obj )
          obj.cards = obj.cards( randperm(52) );
     end
 end

【讨论】:

  • 我使用该行来创建一个包含 52 个条目的向量。我刚刚尝试删除它,但后来我只得到了 13 个 1x1 结构的结构,每个结构都包含钻石、铁锹、俱乐部、心。这就是我得到的 a=create(deck) a = 1x13 struct array with fields: diamond spade heart club a = 1x13 struct array with fields: diamond spade heart club EDU>> a(1) ans = diamond: [1x1 cards]黑桃:[1x1 牌] 心:[1x1 牌] 俱乐部:[1x1 牌]
  • @larryquach 在这种情况下,您需要您的属性不是 4 个“形状”而是单个单元格,比如说 deck,然后您必须相应地更改类。
  • 所以尝试了这个,但我得到一个错误,说达到了最大递归限制 500。这是我当前的代码:classdef Deck
  • 你不能在构造函数中有obj(k)——你构造了一个单个对象。你可能有obj.card(k) = { ... } ;
【解决方案2】:

我想你想要一个属性是Card 对象的数组。请参阅MATLAB documentation for object arrays。以下是我将如何解决这个问题:

classdef Deck < handle
    properties
        % This will be an object array of Card objects.
        CardArray
    end

    properties (Dependent)
        nCards
    end

    methods 
        function This = Deck()
            % preallocate arrays.
            % the constructor for Card should accept 0 arguments.
            Diamond(13) = Card('D', 'R', 13);
            Spade(13) = Card('S', 'B', 13);
            Heart(13) = Card('H', 'R', 13);
            Club(13) = Card('C', 'B', 13);

            % now fill in the rest of each suit
            for iVal = 1:12
                Diamond(iVal) = Card('D', 'R', iVal);
                Spade(iVal) = Card('S', 'B', iVal); 
                Heart(iVal) = Card('H', 'R', iVal); 
                Club(iVal) = Card('C', 'B', iVal);  
            end

            % finally concatenate them into a single array
            This.CardArray = [Diamond, Spade, Heart, Club];
        end

        function shuffle(This) 
            This.CardArray = This.CardArray(randperm(This.nCards)); 
        end

        function n = get.nCards(This)
            n = length(This.CardArray);
        end
    end
end

您需要确保您的 Card 构造函数接受零参数。例如,您可以执行以下操作:

classdef Card < handle

    properties
        symbol = 'D'
        color = 'R'
        value = 1;
    end

    methods
        function This = Card(varargin)
            if nargin >= 1
                This.symbol = varargin{1};
            end
            if nargin >= 2
                This.color = varargin{2};
            end
            if nargin >= 3
                This.value = varargin{3};
            end
        end

    end

end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多