Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

C/++/# Error in inner product of vectors and index

  1. May 12, 2016 #1
    Hello

    I found a bug in my code and can't figuring out the error. I tried debugging by showing the output of each variable step by step but I can't find my error. Here is what I have and what I want to do:

    I have a matrix A:
    0000
    0101
    1010
    1111

    And I have a matrix B:
    10000
    21000
    30100
    41100
    20010
    21010
    40110
    41110
    30001
    41001
    30101
    41101
    40011
    41011
    40111
    41111

    The matrix B has 16 rows and 5 coloumns. The matrix A has 4 rows and 4 coloumns. Now I declare a matrix C that has 4 rows and 16 coloumns.

    What I want to do is to calculate the inner product of each row from B with a corresponding row from A. With corresponding I mean that the first coloumn of B shoud define the row from A that I want to multiply. So the B matrix has in fact also four-dimensional vectors and the first element corresponds to the row of A. One could say this first coloumn of B is an index for choosing the row of A. Because C++ start counting by zero I substract one for my index. Here is my code:


    Code (C):

    std::vector< std::vector<int> > C(4, std::vector<int>(16));
    std::vector<int> index(4);
    std::vector<int> vectorA(4);
    std::vector<int> vectorB(4);

    for( int y = 0; y < 16; y++)
    {
         
        for(int i=0; i<4; ++i){
        vectorA[i] = A[ B[y][0]-1 ][i];
        }

        for( int x = 1; x < 4; x++)
        {

            vectorB[x -1] = B[y][x];

        }


    C[ B[y][0] -1][index[ B[y][0] -1] ] = inner_product(vectorA.begin(), vectorA.end(), vectorB.begin(), 0);

        index[B[y][0]-1] += 1;
    }

    This results in my matrix C:
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    1 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0
    1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
    2 2 3 1 2 1 2 2 3 0 0 0 0 0 0 0

    The first two rows are correct but row three and four are false.
    The correct solution has to be (maybe except of ordering in row 3 and 4):

    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    1 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0
    1 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0
    4 3 3 2 3 2 3 2 2 0 0 0 0 0 0 0

    Where is my problem? Please help, it drives me crazy :(

    Thanks and greetings.
     
  2. jcsd
  3. May 12, 2016 #2

    jedishrfu

    Staff: Mentor

    Why not place print statements inside the for loops and let the computer show you what it is doing at each step or better yet if you have a debugger step through your code and compare your understanding of the process with what the computer is doing?
     
  4. May 12, 2016 #3
    Hi

    I did exactly this but can't figure it out. I guess there must be a problem in my coding logic?
     
  5. May 12, 2016 #4

    jedishrfu

    Staff: Mentor

    What I'm saying is you need to vet each value the computer prints out and agree that its what you expect to see. Only then will you either find your error or realize that maybe your understanding of the algorithm is wrong.
     
  6. May 12, 2016 #5
    I have to learn a lot and will spend more time with this. I understand what you mean and tried it. Can you give me a hint what could be wrong in my code? For someone who knows C++ this should be an easy beginners question?
     
  7. May 12, 2016 #6

    jedishrfu

    Staff: Mentor

    Not understanding your code but the loop where you set x=1 shouldn't it use x<5?
     
  8. May 12, 2016 #7

    Stephen Tashi

    User Avatar
    Science Advisor

    It might be an easy question if you give a complete program that can be compiled. It's hard to debug code fragments.
     
  9. May 12, 2016 #8
    @jedishrfu

    You are totally right. With x<5 the program works correct. Now it makes sense. But I have to say I am a little sad that I can't figure this out by printing the variables step by step :( I think I will write little programs where I know exactly whats happening and make explicit error in the loops for learning and studying debugging. Thanks for help
     
  10. May 12, 2016 #9

    jedishrfu

    Staff: Mentor

    Yes, that's an excellent way to learn a language usually though it will be compile mistakes that occur.

    However, there are some logic errors like this that can be exasperating but you collect these gems in your head and vow not to make the same error again.

    In your problem here, I would have printed the loop values and the other values so that I could step thru each operation and then it might have occurred to me that wait I didn't use all the elements of B.

    Also I'd suggest learning to use a debugger that way you an skip the print statements and focus on your code. This also eliminates the potential problem of a bug in your print statements.
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?
Draft saved Draft deleted



Similar Discussions: Error in inner product of vectors and index
  1. Error of execution (Replies: 1)

  2. Error on Python (Replies: 9)

  3. Error in code (Replies: 4)

  4. F77 error (Replies: 3)

Loading...