Mexed function gives very slight difference when performing math - matlab

So I tried the matrix exponential function using MATLAB's Coder toolkit, and I got it to build. I went on to test to see if the results were reliable and more efficient. While the code was faster, the answer it produced was very slight.
I ran the original function and got an answer of:
p =
1 0 0 0 0 0 0 0 0 0 0 0
-0.05 1 -1.25e-07 5e-06 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0
1.25e-07 -5e-06 -0.05 1 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 -0.05 1 0 0 0 0 0 0
-2.0833e-05 0.00125 -5.2083e-11 4.1667e-09 0 0 1 0.05 0 1.25e-07 0 0
-0.00125 0.05 -4.1667e-09 2.5e-07 0 0 0 1 0 5e-06 0 0
5.2083e-11 -4.1667e-09 -2.0833e-05 0.00125 0 0 0 -1.25e-07 1 0.05 0 0
4.1667e-09 -2.5e-07 -0.00125 0.05 0 0 0 -5e-06 0 1 0 0
0 0 0 0 -2.0833e-05 0.00125 0 0 0 0 1 0.05
0 0 0 0 -0.00125 0.05 0 0 0 0 0 1
And I then ran the mexed version of the function with the same input:
p2 =
1 0 0 0 0 0 0 0 0 0 0 0
-0.05 1 -1.25e-07 5e-06 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0
1.25e-07 -5e-06 -0.05 1 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 -0.05 1 0 0 0 0 0 0
-2.0833e-05 0.00125 -5.2083e-11 4.1667e-09 0 0 1 0.05 0 1.25e-07 0 0
-0.00125 0.05 -4.1667e-09 2.5e-07 0 0 0 1 0 5e-06 0 0
5.2083e-11 -4.1667e-09 -2.0833e-05 0.00125 0 0 0 -1.25e-07 1 0.05 0 0
4.1667e-09 -2.5e-07 -0.00125 0.05 0 0 0 -5e-06 0 1 0 0
0 0 0 0 -2.0833e-05 0.00125 0 0 0 0 1 0.05
0 0 0 0 -0.00125 0.05 0 0 0 0 0 1
At first glance, these two matrices are equal, but they are actually VERY SLIGHTLY off:
p-p2
ans =
0 0 0 0 0 0 0 0 0 0 0 0
-6.9389e-18 0 0 8.4703e-22 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
-3.3881e-21 -2.1684e-19 -3.2312e-26 8.2718e-25 0 0 0 0 0 5.294e-23 0 0
-2.1684e-19 0 -8.2718e-25 5.294e-23 0 0 0 0 0 8.4703e-22 0 0
6.4623e-27 0 -3.3881e-21 2.1684e-19 0 0 0 0 0 0 0 0
0 0 0 6.9389e-18 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
Most of the result is equivalent to the original function, but some of it is not. Also, the difference between the two is so small that I cant possibly believe it would be a mathematical error, rather than perhaps a precision error. And the reason I am so concerned with this, is because this does cause issues with the overlaying reason I am using the function.
Is there a reason why the mex function is off by so little, and is there a way to fix this?

The differences you observe are so little that you can consider the results actually are the same.
The way they are computed are different and that is why you do not get exactly the same result. Yet the difference is roughly machine epsilon and is just due to the fact that computers do not work with an infinite precision but with some discrete representation of the numbers.

Related

Numerical errors when solving Ax=b in MATLAB

I am attempting to solve the system Ax = b in MATLAB, where A is a 30x30 triangular matrix with (nonzero) values ranging from 1e-14 to 0.7, and b is a 30-element column vector with values ranging from 1e-3 to 1e3. When I enter x = A\b, I get an answer and no warning messages, but the answer is not reasonable (looks like just random numbers at the bottom of the vector). I presume this is due to numerical errors.
Message 5 on this page suggests decomposing/scaling the matrix in order to avoid numerical errors, but I haven't been able to figure out how to calculate the scaling matrices.
So the question is: Is this indeed an example of numerical instability, and if so, how can I rescale my matrix A, or change how MATLAB is performing the calculation, to avoid it?
Here is the matrix and vector that are producing the issue:
A =
Columns 1 through 15
0.69 0.4278 0.19893 0.082223 0.031861 0.011852 0.0042866 0.0015187 0.00052965 0.00018243 6.221e-05 2.1038e-05 7.0653e-06 2.3587e-06 7.8344e-07
0 0.4761 0.44277 0.27452 0.14183 0.065953 0.028624 0.011831 0.0047156 0.0018273 0.00069233 0.00025755 9.4356e-05 3.4126e-05 1.2206e-05
0 0 0.32851 0.40735 0.3157 0.19573 0.10618 0.052668 0.02449 0.010846 0.004623 0.0019108 0.00077007 0.00030383 0.00011773
0 0 0 0.22667 0.35134 0.32675 0.23635 0.14653 0.081766 0.042246 0.02058 0.0095696 0.0042851 0.0018597 0.00078615
0 0 0 0 0.1564 0.29091 0.31564 0.26093 0.182 0.11284 0.064129 0.03408 0.017168 0.0082788 0.0038496
0 0 0 0 0 0.10792 0.23418 0.29039 0.27006 0.2093 0.14274 0.088499 0.05095 0.02764 0.014281
0 0 0 0 0 0 0.074464 0.18467 0.25761 0.2662 0.22694 0.16884 0.1134 0.070311 0.040868
0 0 0 0 0 0 0 0.05138 0.14335 0.22219 0.25256 0.23488 0.18931 0.13694 0.090965
0 0 0 0 0 0 0 0 0.035452 0.1099 0.18738 0.23235 0.2341 0.2032 0.15748
0 0 0 0 0 0 0 0 0 0.024462 0.083415 0.15515 0.20842 0.22614 0.21031
0 0 0 0 0 0 0 0 0 0 0.016879 0.062789 0.12652 0.18303 0.21277
0 0 0 0 0 0 0 0 0 0 0 0.011646 0.046935 0.10185 0.15786
0 0 0 0 0 0 0 0 0 0 0 0 0.008036 0.034876 0.081087
0 0 0 0 0 0 0 0 0 0 0 0 0 0.0055448 0.025783
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0038259
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Columns 16 through 30
2.5906e-07 8.5327e-08 2.8007e-08 9.1646e-09 2.9906e-09 9.7342e-10 3.1613e-10 1.0246e-10 3.3142e-11 1.0702e-11 3.4504e-12 1.1108e-12 3.5709e-13 1.1465e-13 3.6767e-14
4.3246e-06 1.5194e-06 5.2988e-07 1.8359e-07 6.3236e-08 2.1667e-08 7.3883e-09 2.5085e-09 8.4833e-10 2.8585e-10 9.5998e-11 3.214e-11 1.073e-11 3.5726e-12 1.1866e-12
4.492e-05 1.6909e-05 6.2902e-06 2.3156e-06 8.445e-07 3.0543e-07 1.0963e-07 3.9084e-08 1.3847e-08 4.8779e-09 1.7094e-09 5.9615e-10 2.0698e-10 7.1568e-11 2.4651e-11
0.00032494 0.00013173 5.2503e-05 2.0616e-05 7.9887e-06 3.0592e-06 1.1591e-06 4.3497e-07 1.6181e-07 5.9715e-08 2.1877e-08 7.9615e-09 2.8794e-09 1.0354e-09 3.7037e-10
0.0017358 0.00076232 0.00032721 0.00013766 5.69e-05 2.3151e-05 9.2878e-06 3.679e-06 1.4406e-06 5.5824e-07 2.1426e-07 8.1515e-08 3.0763e-08 1.1523e-08 4.2867e-09
0.0070833 0.0033935 0.001578 0.00071495 0.00031662 0.00013741 5.8573e-05 2.4566e-05 1.0154e-05 4.1418e-06 1.6691e-06 6.6527e-07 2.6248e-07 1.0259e-07 3.9755e-08
0.022523 0.01187 0.0060211 0.0029554 0.0014095 0.00065541 0.00029799 0.00013279 5.8116e-05 2.5022e-05 1.0615e-05 4.4423e-06 1.8361e-06 7.5031e-07 3.0339e-07
0.056398 0.033024 0.018428 0.0098671 0.005098 0.0025529 0.0012436 0.00059114 0.00027488 0.00012531 5.6113e-05 2.4719e-05 1.0728e-05 4.5926e-06 1.9414e-06
0.11158 0.073506 0.045573 0.026843 0.01513 0.0082078 0.0043059 0.0021929 0.0010877 0.00052686 0.00024979 0.00011615 5.3064e-05 2.3852e-05 1.0563e-05
0.17385 0.13089 0.091294 0.059747 0.037043 0.021923 0.012459 0.0068335 0.0036315 0.0018763 0.00094518 0.00046536 0.00022441 0.00010618 4.9374e-05
0.21107 0.18539 0.14778 0.10881 0.074955 0.048796 0.030253 0.017976 0.010288 0.0056949 0.0030601 0.0016008 0.00081734 0.00040822 0.00019981
0.19575 0.20632 0.19188 0.16145 0.12513 0.090508 0.061727 0.04001 0.024806 0.014788 0.0085139 0.0047507 0.0025773 0.0013629 0.00070418
0.13406 0.17663 0.19712 0.1935 0.17139 0.13947 0.10569 0.075354 0.050967 0.032916 0.020408 0.012201 0.0070603 0.003967 0.0021702
0.063943 0.11233 0.1567 0.18459 0.19074 0.17739 0.15122 0.1198 0.089133 0.062798 0.042179 0.027157 0.016837 0.010091 0.0058655
0.018977 0.050003 0.093006 0.13695 0.16982 0.18425 0.17952 0.15999 0.13226 0.1025 0.075107 0.052387 0.034978 0.022461 0.013926
0.0026399 0.013912 0.038815 0.076207 0.11812 0.15379 0.17481 0.17806 0.16559 0.14259 0.11493 0.087452 0.063257 0.043745 0.029059
0 0.0018215 0.010164 0.029933 0.061862 0.10068 0.13733 0.16319 0.17345 0.16803 0.15048 0.12595 0.099387 0.074457 0.053266
0 0 0.0012569 0.0074028 0.022949 0.049799 0.084907 0.12108 0.15014 0.16622 0.16747 0.15575 0.13519 0.11049 0.085626
0 0 0 0.00086723 0.0053768 0.017502 0.039787 0.07092 0.10553 0.13631 0.15695 0.16421 0.15837 0.14237 0.12037
0 0 0 0 0.00059839 0.0038955 0.013284 0.031571 0.058722 0.091019 0.12227 0.1462 0.15862 0.15845 0.14736
0 0 0 0 0 0.00041289 0.0028159 0.010039 0.024896 0.048236 0.077756 0.10847 0.1345 0.15115 0.15618
0 0 0 0 0 0 0.00028489 0.0020313 0.0075564 0.019521 0.039334 0.065845 0.095256 0.12234 0.14222
0 0 0 0 0 0 0 0.00019658 0.0014625 0.0056673 0.015226 0.031861 0.05531 0.082873 0.1101
0 0 0 0 0 0 0 0 0.00013564 0.0010512 0.0042363 0.011819 0.025648 0.046115 0.071478
0 0 0 0 0 0 0 0 0 9.359e-05 0.00075433 0.0031569 0.0091339 0.020528 0.038183
0 0 0 0 0 0 0 0 0 0 6.4577e-05 0.00054051 0.0023458 0.0070296 0.016344
0 0 0 0 0 0 0 0 0 0 0 4.4558e-05 0.00038676 0.0017385 0.0053894
0 0 0 0 0 0 0 0 0 0 0 0 3.0745e-05 0.0002764 0.0012852
0 0 0 0 0 0 0 0 0 0 0 0 0 2.1214e-05 0.00019729
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.4638e-05
b =
3712
246.89
43.304
22.55
14.897
10.066
6.8138
4.6131
3.1232
2.1146
1.4316
0.96927
0.65623
0.44429
0.3008
0.20365
0.13788
0.093351
0.063202
0.04279
0.02897
0.019614
0.013279
0.0089906
0.006087
0.0041211
0.0027902
0.001889
0.0012789
0.00086589
A .mat file with the full-precision variables may be found here.
Here are the results I'm getting on my machine (Matlab R2013a on OS X 10.10.5):
>> x=A\b
x =
5087.6
433.99
64.166
27.995
19.494
14.546
10.934
8.2265
6.1834
4.6933
3.2779
3.8272
-3.5375
23.953
-79.278
254.22
-702.1
1713.2
-3658.2
6822.7
-11046
15412
-18349
18393
-15244
10181
-5273.4
1992.3
-489.85
59.155
Although norm(A*x-b) returns a value on the order of 1e-13, the results are not physically reasonable given the problem I am trying to solve (values in x should be monotonically decreasing, and none should be negative). As an example, here is a similar dataset that returns a correct (looking) solution with the same matrix A:
>> c
c =
5142.1
339.52
22.417
1.4802
0.097731
0.0064529
0.00042607
2.8132e-05
1.8575e-06
1.2265e-07
8.0979e-09
5.3469e-10
3.5304e-11
2.331e-12
1.5391e-13
1.0162e-14
6.7099e-16
4.4304e-17
2.9253e-18
1.9315e-19
1.2753e-20
8.4205e-22
5.5598e-23
3.671e-24
2.4239e-25
1.6004e-26
1.0567e-27
6.9771e-29
4.6068e-30
3.0418e-31
>> x = A\c
x =
7029.1
653.25
60.709
5.642
0.52434
0.04873
0.0045287
0.00042087
3.9114e-05
3.635e-06
3.3782e-07
3.1395e-08
2.9177e-09
2.7116e-10
2.52e-11
2.342e-12
2.1765e-13
2.0227e-14
1.8798e-15
1.747e-16
1.6236e-17
1.5089e-18
1.4023e-19
1.3033e-20
1.21e-21
1.1339e-22
9.9766e-24
1.1858e-24
2.3902e-26
2.078e-26

Plotting a tour from an MST

I am new to matlab coding and I would like to know how to plot a tour visiting all points in a minimum spanning tree (yes, TSP/TSM). I was given a set of points a matrix of 20x2 and I was able to find out the MST of these points and I need help figuring out how to plan a tour of these points of minimum possible distance?
my adj matrix for the MST is,
X_st =
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1
0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0
0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0
1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0
0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Obtained from kruskal algorithm to plot a MST of a complete graph.
My, neighbouring weighted matrix obtained from kruskal function is,
1 3
7 17
5 20
6 14
1 17
6 20
16 19
2 14
7 11
6 18
12 19
14 16
10 19
8 11
2 8
3 15
9 18
4 19
13 15
Any guidance would be much appreciated.
once you have extracted the points for the MST using krushkals algorithm u need to use f=figure then for each (x,y) point it has to be like f = f + plot(x1,y1,x2,y2,[options]) plot and the plot code should be surrounded by hold on hold off please let me know if the answer was helpful the complete snippet will be like
f = figure;
hold on
f = f + plot(x1,y1,x2,y2) //put this in a loop for all points
hold off

least-squares method with a constraint

I have 37 linear equations with 36 variables in the form of matrix: A x = b. (A has 37 rows and 36 columns.) The equations don't have an exact solution so I have used Matlab to find the closest answer using x = A \ b.
The problem is that I also have a condition, all elements of x should be positive: xi > 0 for all i. x = A \ b gives negative values for some elements. How can I apply this constraint ?
Here are the concrete values of A and b that I'm working with:
A = [0.83 0.17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0.02 0.63 0.17 0 0 0 0.18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0.02 -0.37 0.17 0 0 0 0.18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0.02 -0.37 0.17 0 0 0 0.18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0.02 -0.37 0.17 0 0 0 0.18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0.02 -0.2 0 0 0 0 0.18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0.15 0 0 0 0 0 -0.32 0.17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0.15 0 0 0 0 0.02 -0.52 0.17 0 0 0 0.18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0.15 0 0 0 0 0.02 -0.52 0.17 0 0 0 0.18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0.15 0 0 0 0 0.02 -0.52 0.17 0 0 0 0.18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0.15 0 0 0 0 0.02 -0.52 0.17 0 0 0 0.18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0.15 0 0 0 0 0.02 -0.33 0 0 0 0 0.18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0.15 0 0 0 0 0 -0.32 0.17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0.15 0 0 0 0 0.02 -0.52 0.17 0 0 0 0.18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0.15 0 0 0 0 0.02 -0.52 0.17 0 0 0 0.18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0.15 0 0 0 0 0.02 -0.52 0.17 0 0 0 0.18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0.15 0 0 0 0 0.02 -0.52 0.17 0 0 0 0.18 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0.15 0 0 0 0 0.02 -0.35 0 0 0 0 0.18 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0.15 0 0 0 0 0 -0.32 0.17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0 0 0 0 0.02 -0.52 0.17 0 0 0 0.18 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0 0 0 0 0.02 -0.52 0.17 0 0 0 0.18 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0 0 0 0 0.02 -0.52 0.17 0 0 0 0.18 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0 0 0 0 0.02 -0.52 0.17 0 0 0 0.18 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0 0 0 0 0.02 -0.35 0 0 0 0 0.18 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0 0 0 0 0 -0.32 0.17 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0 0 0 0 0.02 -0.52 0.17 0 0 0 0.18 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0 0 0 0 0.02 -0.52 0.17 0 0 0 0.18 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0 0 0 0 0.02 -0.52 0.17 0 0 0 0.18 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0 0 0 0 0.02 -0.52 0.17 0 0 0 0.18 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0 0 0 0 0.02 -0.35 0 0 0 0 0.018 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0 0 0 0 0 -0.32 0.17 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0 0 0 0 0.02 -0.34 0.17 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0 0 0 0 0.02 -0.34 0.17 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0 0 0 0 0.02 -0.34 0.17 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0 0 0 0 0.02 -0.34 0.17
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0 0 0 0 0.02 -0.17
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1];
b = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1]';
You want to find an approximate solution x to A x = b in the least-squares sense, i.e. you want to minimize
||A x - b||2 = xT AT A x
+ bT b - 2 xT AT b.
Disregarding the constant term bTb and dividing by a factor 2, this fits the form of a quadratic programming problem, which is to minimize
1/2 xT H x + fT x,
if we choose H = AT A and f = - AT b.
The corresponding use of quadprog is:
H = A' * A;
f = - A' * b;
x = quadprog(H, f)
You also want the elements of x to be positive. A non-negativity constraint can be introduced using the additional parameters to quadprog, A and b (not to be confused with your matrices!):
n = size(A, 2);
x = quadprog(H, f, -eye(n), zeros(n, 1))
A positivity constraint does not make sense, because if the optimal solution involves one or more elements of x to be exactly 0, then a strictly positive solution will be the better the smaller the corresponding elements are: 0.01 will be better than 0.1, 0.001 will be better than 0.01, etc. etc. – there is no natural bound. If you want to make sure that the solution is all-positive, you have to set a finite bound yourself:
x = quadprog(H, f, -eye(n), zeros(n, 1) + 0.001)
Now the smallest possible value of an element of x is 0.001.
Update after the question was supplemented with the actual data of A and b: Using the code
H = A' * A;
f = - A' * b;
n = size(A, 2);
x = quadprog(H, f, -eye(n), zeros(n, 1))
I get the result:
Minimum found that satisfies the constraints.
Optimization completed because the objective function is non-decreasing in
feasible directions, to within the default value of the function tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.
<stopping criteria details>
x =
0.000380906335150292
3.90638261088393e-05
0.0111196970167585
0.0227055107206744
0.0318402514628274
0.0371743514880516
0.000800900221354844
0.00746652476710186
0.0180511534370576
0.0282423767946842
0.0362606972021829
0.0417582260990786
0.00860220929402253
0.0174105435824309
0.0265771677458008
0.0343071472371469
0.0395176470725881
0.0419494410289298
0.0187719294637544
0.0268976053211278
0.0336818044612046
0.0382365751296441
0.0398823076542831
0.0391016682549663
0.0279383031707377
0.0339393563379992
0.0377917413001034
0.0382731422972829
0.0338557405807941
0.0217568643500703
0.0343698083354502
0.0381554349806972
0.0392353941260779
0.0368010570888738
0.031271868401718
0.0258232230013864
This would be a linear optimization problem when you have x>0 condition. The best algorithm to solve that is simplex algorithm. The idea is that each linear equation aix=bi provide a line and the combination of these lines provide a polygon/polyhedron and the answer is one of the vertices of this polyhedron/polygon. Simplex algorithm is pretty standard and there are many available functions and libraries tha can calculate that.
The Matlab functions lsqlin or lsqnonneg can be used to solve your issue.
e.g:
x=lsqnonneg(A,b)
will give you what you are looking for.

"""Diagonal""" -1/+1 Matrix

I need to construct the tech cycle constraint matrix Aa and the right side ba. The aim is building the technology cycle matrices in order to solve the scheduling linear problem constrained by Ax<=b. In this case -1 and +1 in A refers to the coefficients of the constraints of the problem such as starting times and precedences
TC = [1,2,3,4,6,7;1,2,5,4,6,7;2,5,6,7,0,0]; % Technology cycle
CT = [100,60,200,160,80,120;100,60,150,120,60,150;50,120,40,30,0,0]; % Cycle time
n_jb = size(TC,1); % number of jobs
n_op = sum(TC~=0,2); % number of operations for each job
N_op = sum(n_op); % total number of operations
c=1; % indice for constraints in Aa
Op=1; % counter for overall operation
n_tf = N_op - n_jb- sum(n_op==1); % number of job transfer between machines (also number of tech cycle constraint numbers)
Aa = zeros(n_tf,N_op); % Constraint matrx for tech cycle
ba = zeros(n_tf,1); % The right vector of the constraint function: Aa*x<=ba
for j=1:n_jb
if n_op(j)>1
for op=1:n_op(j)-1
Aa(c,Op)=-1;
Aa(c,Op+1)=1;
ba(c,1)=CT(j,op);
c=c+1;
Op=Op+1;
end
else
Op=Op+1;
end
Op=Op+1;
end
The output, like Aa is 3 """diagonal""" -1/+1 matrices:
-1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 -1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 -1 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 -1 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 -1 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 -1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 -1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 -1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 -1 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 -1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 -1 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1
In order to be more precise in the following there is an image: showing the 3 different part of the matrix Aa. My question is: Is there a way to build the same this avoiding loops since A is not a 3x1 but will definitely become 30-50x1?
You can use diag to create the positive and negative ones. The second input to diag is to shift the diagonal to the side. In this case, 1 to the right.
Use cumsum to find the rows you want to remove. For n = [6, 6, 4], you want to remove the 6th, 12th and 16th row.
n = [6, 6, 4];
cols = sum(n);
A = -eye(cols) + diag(ones(cols-1,1), 1);
A(cumsum(n),:) = []
A =
-1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 -1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 -1 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 -1 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 -1 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 -1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 -1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 -1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 -1 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 -1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 -1 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1

Flipping Around 5 percent of 1's and 0's

For the following letter, I wish to add noise to it by changing 5 percent of the 1's into 0's. So far, I have the following code which turns them all into 0's. Can someone please point me in the right direction? Thank you!
letterA = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ...
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 ...
0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 ...
0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 ...
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 ...
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ...
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ...
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 ...
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 ...
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 ...
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ...
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 ...
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];
for i=1:numel(letterA)
if letterA(i)==1
letterA(i)=0;
end
end
disp(letterA)
try this:
letterA( letterA == 1 & rand(size(letterA)) <= 0.05 ) = 0;
In fact you could also do
letterA( rand(size(letterA)) <= 0.05 ) = 0;
which sets each element with probability of 5% to zero. The already zero elements are not affected. I think what causes confusion here is that you have to recognize that each element is independently handled from each other. It makes no difference if you do the first or the second version.
You can check it:
letterA = (rand(1e5,1) < 0.2); N1 = nnz(letterA);
letterA( rand(size(letterA)) <= 0.05 ) = 0;
(N1 - nnz(letterA))/N1
which gives values around 0.05, i.e. 5%. And it is not true what EitanT says, that it will flip at maximum 5%. It can be more than 5% or less, but on average it is 5%.
EitanTs version flippes exactly 5%, so which version to select depends on the application. For EitanT version the noise is correlated to the signal (because it is exact), which may or may not be what you want.
The basic approach is to find the indices of the 1's and count them, randomly pick a desired amount of indices out of them, and then operate on them:
one_flip_ratio = 0.05;
idx_ones = find(letterA == 1); %// Indices of 1's
flips = round(one_flip_ratio * numel(idx_ones)); %// Number of flips
idx_flips = idx_ones(randperm(numel(idx_ones), flips)); %// Indices of elements
letterA(idx_flips) = 0; %// Flip elements
This will flip 5% of the 1's to 0's.
Thanks for throwing out all these ideas, but eventually I came up with this. It will allow me to easily control both letter and background noise, which is what I intend to do. I'm just a novice, so this may not be the most efficient code, but it gets the job done! (I'm not looking for exactly 5%, the naked eye display value is what I'm more worried about.) PLEASE let me know how this can be improved! Thank you.
background_noise_intensity=0.05;
letter_noise_intensity=0.05;
for i=1:numel(letterA)
if letterA(i)==0
if rand < background_noise_intensity
letterA(i)=1;
end
elseif letterA(i)==1
if rand < letter_noise_intensity
letterA(i)=0;
end
end
end
noisy_letters=letterA;
reshaped_noisy_letters=reshape(noisy_letters,37,19)';
imshow(reshaped_noisy_letters);